@@ -4,571 +4,571 @@ discard block |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'access_interface_graphique' => 'Voltar à interface gráfica completa', |
|
| 14 | - 'access_mode_texte' => 'Exibir a interface textual simplificada', |
|
| 15 | - 'admin_debug' => 'debug', |
|
| 16 | - 'admin_modifier_article' => 'Modificar este artigo', |
|
| 17 | - 'admin_modifier_auteur' => 'Modificar este autor', |
|
| 18 | - 'admin_modifier_breve' => 'Modificar esta notícia', |
|
| 19 | - 'admin_modifier_mot' => 'Modificar esta palavra-chave', |
|
| 20 | - 'admin_modifier_rubrique' => 'Modificar esta rubrica', |
|
| 21 | - 'admin_recalculer' => 'Recompor esta página', |
|
| 22 | - 'afficher_calendrier' => 'Exibir o calendário', |
|
| 23 | - 'afficher_trad' => 'exibir as traduções', |
|
| 24 | - 'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.', |
|
| 25 | - 'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :', |
|
| 26 | - 'analyse_xml' => 'Análise XML', |
|
| 27 | - 'annuler' => 'Cancelar', |
|
| 28 | - 'antispam_champ_vide' => 'Por favor deixe este campo vazio :', |
|
| 29 | - 'articles_recents' => 'Artigos mais recentes', |
|
| 30 | - 'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP', |
|
| 31 | - 'avis_archive_invalide' => 'o ficheiro arquivo não é válido ', |
|
| 32 | - 'avis_attention' => ' ATENÇÂO!', |
|
| 33 | - 'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@', |
|
| 34 | - 'avis_colonne_inexistante' => 'A coluna @col@ não existe', |
|
| 35 | - 'avis_erreur' => 'Erro: ver mais abaixo', |
|
| 36 | - 'avis_erreur_connexion' => 'Erro de ligação ', |
|
| 37 | - 'avis_erreur_cookie' => 'problema de cookie', |
|
| 38 | - 'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.', |
|
| 39 | - 'avis_erreur_mysql' => 'Erro SQL', |
|
| 40 | - 'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !', |
|
| 41 | - 'avis_erreur_visiteur' => 'Problema de acesso à área privada', |
|
| 12 | + // A |
|
| 13 | + 'access_interface_graphique' => 'Voltar à interface gráfica completa', |
|
| 14 | + 'access_mode_texte' => 'Exibir a interface textual simplificada', |
|
| 15 | + 'admin_debug' => 'debug', |
|
| 16 | + 'admin_modifier_article' => 'Modificar este artigo', |
|
| 17 | + 'admin_modifier_auteur' => 'Modificar este autor', |
|
| 18 | + 'admin_modifier_breve' => 'Modificar esta notícia', |
|
| 19 | + 'admin_modifier_mot' => 'Modificar esta palavra-chave', |
|
| 20 | + 'admin_modifier_rubrique' => 'Modificar esta rubrica', |
|
| 21 | + 'admin_recalculer' => 'Recompor esta página', |
|
| 22 | + 'afficher_calendrier' => 'Exibir o calendário', |
|
| 23 | + 'afficher_trad' => 'exibir as traduções', |
|
| 24 | + 'alerte_maj_impossible' => '<b>Alerta !</b> A actualização da base de dados SQL para a versão @version@ é impossível, talvez por causa de um problema de permissão de modificação na base de dados. Por favor contacte o seu serviço de hospedagem.', |
|
| 25 | + 'alerte_modif_info_concourante' => 'ATTENÇÃO : Esta informação já foi modificada noutro menu. O valor actual é :', |
|
| 26 | + 'analyse_xml' => 'Análise XML', |
|
| 27 | + 'annuler' => 'Cancelar', |
|
| 28 | + 'antispam_champ_vide' => 'Por favor deixe este campo vazio :', |
|
| 29 | + 'articles_recents' => 'Artigos mais recentes', |
|
| 30 | + 'avis_archive_incorrect' => 'o ficheiro arquivo não é um ficheiro SPIP', |
|
| 31 | + 'avis_archive_invalide' => 'o ficheiro arquivo não é válido ', |
|
| 32 | + 'avis_attention' => ' ATENÇÂO!', |
|
| 33 | + 'avis_champ_incorrect_type_objet' => 'Nome de campo incorrecto @name@ para objecto de tipo @type@', |
|
| 34 | + 'avis_colonne_inexistante' => 'A coluna @col@ não existe', |
|
| 35 | + 'avis_erreur' => 'Erro: ver mais abaixo', |
|
| 36 | + 'avis_erreur_connexion' => 'Erro de ligação ', |
|
| 37 | + 'avis_erreur_cookie' => 'problema de cookie', |
|
| 38 | + 'avis_erreur_fonction_contexte' => 'Erro de programação. Não se pode chamar esta função neste contexto.', |
|
| 39 | + 'avis_erreur_mysql' => 'Erro SQL', |
|
| 40 | + 'avis_erreur_sauvegarde' => 'Erro na cópia de segurança (@type@ @id_objet@) !', |
|
| 41 | + 'avis_erreur_visiteur' => 'Problema de acesso à área privada', |
|
| 42 | 42 | |
| 43 | - // B |
|
| 44 | - 'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave', |
|
| 45 | - 'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.', |
|
| 46 | - 'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ', |
|
| 47 | - 'barre_eo' => 'Inserir um E no O', |
|
| 48 | - 'barre_eo_maj' => 'Inserir um E no O maiúsculo', |
|
| 49 | - 'barre_euro' => 'Inserir o símbolo €', |
|
| 50 | - 'barre_gras' => ' Escrever em {{negro}}', |
|
| 51 | - 'barre_guillemets' => 'Colocar entre "aspas" ', |
|
| 52 | - 'barre_guillemets_simples' => 'Colocar entre ’aspas simples’', |
|
| 53 | - 'barre_intertitre' => 'Transfomar em {{{intertítulo}}} ', |
|
| 54 | - 'barre_italic' => 'Pôr em itálico ', |
|
| 55 | - 'barre_lien' => 'Transformar em [ligação hipertexto->http://...]', |
|
| 56 | - 'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ', |
|
| 57 | - 'barre_note' => 'Transformar em [[Nota de rodapé ]]', |
|
| 58 | - 'barre_paragraphe' => 'Criar um parágrafo', |
|
| 59 | - 'barre_quote' => '<quote>Citar uma mensagem</quote>', |
|
| 60 | - 'bouton_changer' => 'Modificar', |
|
| 61 | - 'bouton_chercher' => 'Procurar', |
|
| 62 | - 'bouton_choisir' => 'Seleccionar', |
|
| 63 | - 'bouton_deplacer' => 'Mover', |
|
| 64 | - 'bouton_download' => 'Download', |
|
| 65 | - 'bouton_enregistrer' => 'Guardar', |
|
| 66 | - 'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno', |
|
| 67 | - 'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais', |
|
| 68 | - 'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios', |
|
| 69 | - 'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades', |
|
| 70 | - 'bouton_recharger_page' => 'recarregar esta página', |
|
| 71 | - 'bouton_telecharger' => 'Carregar', |
|
| 72 | - 'bouton_upload' => 'Carregar', |
|
| 73 | - 'bouton_valider' => 'Submeter', |
|
| 43 | + // B |
|
| 44 | + 'barre_a_accent_grave' => 'Inserir um A maiúsculo com acento grave', |
|
| 45 | + 'barre_aide' => 'Utilize as abreviaturas tipográficas para enriquecer a sua paginação.', |
|
| 46 | + 'barre_e_accent_aigu' => 'Inserir um E maiúsculo com acento agudo ', |
|
| 47 | + 'barre_eo' => 'Inserir um E no O', |
|
| 48 | + 'barre_eo_maj' => 'Inserir um E no O maiúsculo', |
|
| 49 | + 'barre_euro' => 'Inserir o símbolo €', |
|
| 50 | + 'barre_gras' => ' Escrever em {{negro}}', |
|
| 51 | + 'barre_guillemets' => 'Colocar entre "aspas" ', |
|
| 52 | + 'barre_guillemets_simples' => 'Colocar entre ’aspas simples’', |
|
| 53 | + 'barre_intertitre' => 'Transfomar em {{{intertítulo}}} ', |
|
| 54 | + 'barre_italic' => 'Pôr em itálico ', |
|
| 55 | + 'barre_lien' => 'Transformar em [ligação hipertexto->http://...]', |
|
| 56 | + 'barre_lien_input' => 'Por favor indique o endereço da sua ligação (pode indicar um endereço Web sob a forma http://www.monsite/com ou simplesmente indicar o número de um artigo deste sítio.) ', |
|
| 57 | + 'barre_note' => 'Transformar em [[Nota de rodapé ]]', |
|
| 58 | + 'barre_paragraphe' => 'Criar um parágrafo', |
|
| 59 | + 'barre_quote' => '<quote>Citar uma mensagem</quote>', |
|
| 60 | + 'bouton_changer' => 'Modificar', |
|
| 61 | + 'bouton_chercher' => 'Procurar', |
|
| 62 | + 'bouton_choisir' => 'Seleccionar', |
|
| 63 | + 'bouton_deplacer' => 'Mover', |
|
| 64 | + 'bouton_download' => 'Download', |
|
| 65 | + 'bouton_enregistrer' => 'Guardar', |
|
| 66 | + 'bouton_radio_desactiver_messagerie_interne' => 'Desactivar a caixa de correio interno', |
|
| 67 | + 'bouton_radio_envoi_annonces' => 'Enviar os anúncios editoriais', |
|
| 68 | + 'bouton_radio_non_envoi_annonces' => 'Não enviar anúncios', |
|
| 69 | + 'bouton_radio_non_envoi_liste_nouveautes' => 'Não enviar a lista das novidades', |
|
| 70 | + 'bouton_recharger_page' => 'recarregar esta página', |
|
| 71 | + 'bouton_telecharger' => 'Carregar', |
|
| 72 | + 'bouton_upload' => 'Carregar', |
|
| 73 | + 'bouton_valider' => 'Submeter', |
|
| 74 | 74 | |
| 75 | - // C |
|
| 76 | - 'cal_apresmidi' => 'tarde', |
|
| 77 | - 'cal_jour_entier' => 'dia todo', |
|
| 78 | - 'cal_matin' => 'manhã', |
|
| 79 | - 'cal_par_jour' => 'calendário por dia', |
|
| 80 | - 'cal_par_mois' => 'calendário por mês', |
|
| 81 | - 'cal_par_semaine' => 'calendário por semana', |
|
| 82 | - 'choix_couleur_interface' => 'cor', |
|
| 83 | - 'choix_interface' => 'escolha da interface', |
|
| 84 | - 'colonne' => 'Coluna', |
|
| 85 | - 'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?', |
|
| 86 | - 'correcte' => 'correcto', |
|
| 75 | + // C |
|
| 76 | + 'cal_apresmidi' => 'tarde', |
|
| 77 | + 'cal_jour_entier' => 'dia todo', |
|
| 78 | + 'cal_matin' => 'manhã', |
|
| 79 | + 'cal_par_jour' => 'calendário por dia', |
|
| 80 | + 'cal_par_mois' => 'calendário por mês', |
|
| 81 | + 'cal_par_semaine' => 'calendário por semana', |
|
| 82 | + 'choix_couleur_interface' => 'cor', |
|
| 83 | + 'choix_interface' => 'escolha da interface', |
|
| 84 | + 'colonne' => 'Coluna', |
|
| 85 | + 'confirm_changer_statut' => 'Atenção, solicitou a alteração do estatuto deste elemento. Deseja continuar?', |
|
| 86 | + 'correcte' => 'correcto', |
|
| 87 | 87 | |
| 88 | - // D |
|
| 89 | - 'date_aujourdhui' => 'hoje', |
|
| 90 | - 'date_avant_jc' => 'a. J.C.', |
|
| 91 | - 'date_dans' => 'entre @delai@', |
|
| 92 | - 'date_de_mois_1' => '@j@ de @nommois@', |
|
| 93 | - 'date_de_mois_10' => '@j@ de @nommois@', |
|
| 94 | - 'date_de_mois_11' => '@j@ de @nommois@', |
|
| 95 | - 'date_de_mois_12' => '@j@ de @nommois@', |
|
| 96 | - 'date_de_mois_2' => '@j@ de @nommois@', |
|
| 97 | - 'date_de_mois_3' => '@j@ de @nommois@', |
|
| 98 | - 'date_de_mois_4' => '@j@ de @nommois@', |
|
| 99 | - 'date_de_mois_5' => '@j@ de @nommois@', |
|
| 100 | - 'date_de_mois_6' => '@j@ de @nommois@', |
|
| 101 | - 'date_de_mois_7' => '@j@ de @nommois@', |
|
| 102 | - 'date_de_mois_8' => '@j@ de @nommois@', |
|
| 103 | - 'date_de_mois_9' => '@j@ de @nommois@', |
|
| 104 | - 'date_demain' => 'amanhã', |
|
| 105 | - 'date_fmt_heures_minutes' => '@h@h@m@min', |
|
| 106 | - 'date_fmt_heures_minutes_court' => '@h@:@m@', |
|
| 107 | - 'date_fmt_jour' => '@nomjour@ @jour@', |
|
| 108 | - 'date_fmt_jour_heure' => '@jour@ a @heure@', |
|
| 109 | - 'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF |
|
| 110 | - 'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF |
|
| 111 | - 'date_fmt_jour_mois' => '@jour@ de @nommois@', |
|
| 112 | - 'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@', |
|
| 113 | - 'date_fmt_mois_annee' => '@nommois@ de @annee@', |
|
| 114 | - 'date_fmt_nomjour' => '@nomjour@ @date@', |
|
| 115 | - 'date_fmt_nomjour_date' => ' @nomjour@ @date@', |
|
| 116 | - 'date_fmt_periode' => 'De @date_debut@ a @date_fin@', |
|
| 117 | - 'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@', |
|
| 118 | - 'date_fmt_periode_from' => 'De', |
|
| 119 | - 'date_fmt_periode_to' => 'a', |
|
| 120 | - 'date_heures' => 'horas', |
|
| 121 | - 'date_hier' => 'ontem', |
|
| 122 | - 'date_il_y_a' => 'há @delai@', |
|
| 123 | - 'date_jnum1' => '1', |
|
| 124 | - 'date_jnum10' => '10', |
|
| 125 | - 'date_jnum11' => '11', |
|
| 126 | - 'date_jnum12' => '12', |
|
| 127 | - 'date_jnum13' => '13', |
|
| 128 | - 'date_jnum14' => '14', |
|
| 129 | - 'date_jnum15' => '15', |
|
| 130 | - 'date_jnum16' => '16', |
|
| 131 | - 'date_jnum17' => '17', |
|
| 132 | - 'date_jnum18' => '18', |
|
| 133 | - 'date_jnum19' => '19', |
|
| 134 | - 'date_jnum2' => '2', |
|
| 135 | - 'date_jnum20' => '20', |
|
| 136 | - 'date_jnum21' => '21', |
|
| 137 | - 'date_jnum22' => '22', |
|
| 138 | - 'date_jnum23' => '23', |
|
| 139 | - 'date_jnum24' => '24', |
|
| 140 | - 'date_jnum25' => '25', |
|
| 141 | - 'date_jnum26' => '26', |
|
| 142 | - 'date_jnum27' => '27', |
|
| 143 | - 'date_jnum28' => '28', |
|
| 144 | - 'date_jnum29' => '29', |
|
| 145 | - 'date_jnum3' => '3', |
|
| 146 | - 'date_jnum30' => '30', |
|
| 147 | - 'date_jnum31' => '31', |
|
| 148 | - 'date_jnum4' => '4', |
|
| 149 | - 'date_jnum5' => '5', |
|
| 150 | - 'date_jnum6' => '6', |
|
| 151 | - 'date_jnum7' => '7', |
|
| 152 | - 'date_jnum8' => '8', |
|
| 153 | - 'date_jnum9' => '9', |
|
| 154 | - 'date_jour_1' => 'domingo', |
|
| 155 | - 'date_jour_1_abbr' => 'Dom.', |
|
| 156 | - 'date_jour_1_initiale' => 'D.', |
|
| 157 | - 'date_jour_2' => 'segunda-feira', |
|
| 158 | - 'date_jour_2_abbr' => 'Seg.', |
|
| 159 | - 'date_jour_2_initiale' => 'S.', |
|
| 160 | - 'date_jour_3' => 'terça-feira', |
|
| 161 | - 'date_jour_3_abbr' => 'Ter.', |
|
| 162 | - 'date_jour_3_initiale' => 'T.', |
|
| 163 | - 'date_jour_4' => 'quarta-feira', |
|
| 164 | - 'date_jour_4_abbr' => 'Qua.', |
|
| 165 | - 'date_jour_4_initiale' => 'Q.', |
|
| 166 | - 'date_jour_5' => 'quinta-feira', |
|
| 167 | - 'date_jour_5_abbr' => 'Qui.', |
|
| 168 | - 'date_jour_5_initiale' => 'Q.', |
|
| 169 | - 'date_jour_6' => 'sexta-feira', |
|
| 170 | - 'date_jour_6_abbr' => 'Sex.', |
|
| 171 | - 'date_jour_6_initiale' => 'S.', |
|
| 172 | - 'date_jour_7' => 'sábado', |
|
| 173 | - 'date_jour_7_abbr' => 'Sab.', |
|
| 174 | - 'date_jour_7_initiale' => 'S.', |
|
| 175 | - 'date_jours' => 'dias', |
|
| 176 | - 'date_minutes' => 'minutos', |
|
| 177 | - 'date_mois' => 'meses', |
|
| 178 | - 'date_mois_1' => 'Janeiro', |
|
| 179 | - 'date_mois_10' => 'Outubro', |
|
| 180 | - 'date_mois_10_abbr' => 'Out.', |
|
| 181 | - 'date_mois_11' => 'Novembro', |
|
| 182 | - 'date_mois_11_abbr' => 'Nov.', |
|
| 183 | - 'date_mois_12' => 'Dezembro', |
|
| 184 | - 'date_mois_12_abbr' => 'Dez.', |
|
| 185 | - 'date_mois_1_abbr' => 'Jan.', |
|
| 186 | - 'date_mois_2' => 'Fevereiro', |
|
| 187 | - 'date_mois_2_abbr' => 'Feb.', |
|
| 188 | - 'date_mois_3' => 'Março', |
|
| 189 | - 'date_mois_3_abbr' => 'Mar', |
|
| 190 | - 'date_mois_4' => 'Abril', |
|
| 191 | - 'date_mois_4_abbr' => 'Abr.', |
|
| 192 | - 'date_mois_5' => 'Maio', |
|
| 193 | - 'date_mois_5_abbr' => 'Mai', |
|
| 194 | - 'date_mois_6' => 'Junho', |
|
| 195 | - 'date_mois_6_abbr' => 'Jun', |
|
| 196 | - 'date_mois_7' => 'Julho', |
|
| 197 | - 'date_mois_7_abbr' => 'Jul', |
|
| 198 | - 'date_mois_8' => 'Agosto', |
|
| 199 | - 'date_mois_8_abbr' => 'Ago', |
|
| 200 | - 'date_mois_9' => 'Setembro', |
|
| 201 | - 'date_mois_9_abbr' => 'Set', |
|
| 202 | - 'date_saison_1' => 'inverno', |
|
| 203 | - 'date_saison_2' => 'primavera', |
|
| 204 | - 'date_saison_3' => 'verão', |
|
| 205 | - 'date_saison_4' => 'outono', |
|
| 206 | - 'date_secondes' => 'segundos', |
|
| 207 | - 'date_semaines' => 'semanas', |
|
| 208 | - 'date_un_mois' => 'mês', |
|
| 209 | - 'date_une_heure' => 'hora', |
|
| 210 | - 'date_une_minute' => 'minuto', |
|
| 211 | - 'date_une_seconde' => 'segundo', |
|
| 212 | - 'date_une_semaine' => 'semana', |
|
| 213 | - 'dirs_commencer' => 'a fim de começar realmente a instalação', |
|
| 214 | - 'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>', |
|
| 215 | - 'dirs_probleme_droits' => 'Problema de direitos de acesso', |
|
| 216 | - 'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b> |
|
| 88 | + // D |
|
| 89 | + 'date_aujourdhui' => 'hoje', |
|
| 90 | + 'date_avant_jc' => 'a. J.C.', |
|
| 91 | + 'date_dans' => 'entre @delai@', |
|
| 92 | + 'date_de_mois_1' => '@j@ de @nommois@', |
|
| 93 | + 'date_de_mois_10' => '@j@ de @nommois@', |
|
| 94 | + 'date_de_mois_11' => '@j@ de @nommois@', |
|
| 95 | + 'date_de_mois_12' => '@j@ de @nommois@', |
|
| 96 | + 'date_de_mois_2' => '@j@ de @nommois@', |
|
| 97 | + 'date_de_mois_3' => '@j@ de @nommois@', |
|
| 98 | + 'date_de_mois_4' => '@j@ de @nommois@', |
|
| 99 | + 'date_de_mois_5' => '@j@ de @nommois@', |
|
| 100 | + 'date_de_mois_6' => '@j@ de @nommois@', |
|
| 101 | + 'date_de_mois_7' => '@j@ de @nommois@', |
|
| 102 | + 'date_de_mois_8' => '@j@ de @nommois@', |
|
| 103 | + 'date_de_mois_9' => '@j@ de @nommois@', |
|
| 104 | + 'date_demain' => 'amanhã', |
|
| 105 | + 'date_fmt_heures_minutes' => '@h@h@m@min', |
|
| 106 | + 'date_fmt_heures_minutes_court' => '@h@:@m@', |
|
| 107 | + 'date_fmt_jour' => '@nomjour@ @jour@', |
|
| 108 | + 'date_fmt_jour_heure' => '@jour@ a @heure@', |
|
| 109 | + 'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ a @heure_fin@', # MODIF |
|
| 110 | + 'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ a @dtstart@@heure_fin@@dtend@', # MODIF |
|
| 111 | + 'date_fmt_jour_mois' => '@jour@ de @nommois@', |
|
| 112 | + 'date_fmt_jour_mois_annee' => '@jour@ de @nommois@ de @annee@', |
|
| 113 | + 'date_fmt_mois_annee' => '@nommois@ de @annee@', |
|
| 114 | + 'date_fmt_nomjour' => '@nomjour@ @date@', |
|
| 115 | + 'date_fmt_nomjour_date' => ' @nomjour@ @date@', |
|
| 116 | + 'date_fmt_periode' => 'De @date_debut@ a @date_fin@', |
|
| 117 | + 'date_fmt_periode_abbr' => 'De @dtart@@date_debut@@dtabbr@ a @dtend@@date_fin@@dtabbr@', |
|
| 118 | + 'date_fmt_periode_from' => 'De', |
|
| 119 | + 'date_fmt_periode_to' => 'a', |
|
| 120 | + 'date_heures' => 'horas', |
|
| 121 | + 'date_hier' => 'ontem', |
|
| 122 | + 'date_il_y_a' => 'há @delai@', |
|
| 123 | + 'date_jnum1' => '1', |
|
| 124 | + 'date_jnum10' => '10', |
|
| 125 | + 'date_jnum11' => '11', |
|
| 126 | + 'date_jnum12' => '12', |
|
| 127 | + 'date_jnum13' => '13', |
|
| 128 | + 'date_jnum14' => '14', |
|
| 129 | + 'date_jnum15' => '15', |
|
| 130 | + 'date_jnum16' => '16', |
|
| 131 | + 'date_jnum17' => '17', |
|
| 132 | + 'date_jnum18' => '18', |
|
| 133 | + 'date_jnum19' => '19', |
|
| 134 | + 'date_jnum2' => '2', |
|
| 135 | + 'date_jnum20' => '20', |
|
| 136 | + 'date_jnum21' => '21', |
|
| 137 | + 'date_jnum22' => '22', |
|
| 138 | + 'date_jnum23' => '23', |
|
| 139 | + 'date_jnum24' => '24', |
|
| 140 | + 'date_jnum25' => '25', |
|
| 141 | + 'date_jnum26' => '26', |
|
| 142 | + 'date_jnum27' => '27', |
|
| 143 | + 'date_jnum28' => '28', |
|
| 144 | + 'date_jnum29' => '29', |
|
| 145 | + 'date_jnum3' => '3', |
|
| 146 | + 'date_jnum30' => '30', |
|
| 147 | + 'date_jnum31' => '31', |
|
| 148 | + 'date_jnum4' => '4', |
|
| 149 | + 'date_jnum5' => '5', |
|
| 150 | + 'date_jnum6' => '6', |
|
| 151 | + 'date_jnum7' => '7', |
|
| 152 | + 'date_jnum8' => '8', |
|
| 153 | + 'date_jnum9' => '9', |
|
| 154 | + 'date_jour_1' => 'domingo', |
|
| 155 | + 'date_jour_1_abbr' => 'Dom.', |
|
| 156 | + 'date_jour_1_initiale' => 'D.', |
|
| 157 | + 'date_jour_2' => 'segunda-feira', |
|
| 158 | + 'date_jour_2_abbr' => 'Seg.', |
|
| 159 | + 'date_jour_2_initiale' => 'S.', |
|
| 160 | + 'date_jour_3' => 'terça-feira', |
|
| 161 | + 'date_jour_3_abbr' => 'Ter.', |
|
| 162 | + 'date_jour_3_initiale' => 'T.', |
|
| 163 | + 'date_jour_4' => 'quarta-feira', |
|
| 164 | + 'date_jour_4_abbr' => 'Qua.', |
|
| 165 | + 'date_jour_4_initiale' => 'Q.', |
|
| 166 | + 'date_jour_5' => 'quinta-feira', |
|
| 167 | + 'date_jour_5_abbr' => 'Qui.', |
|
| 168 | + 'date_jour_5_initiale' => 'Q.', |
|
| 169 | + 'date_jour_6' => 'sexta-feira', |
|
| 170 | + 'date_jour_6_abbr' => 'Sex.', |
|
| 171 | + 'date_jour_6_initiale' => 'S.', |
|
| 172 | + 'date_jour_7' => 'sábado', |
|
| 173 | + 'date_jour_7_abbr' => 'Sab.', |
|
| 174 | + 'date_jour_7_initiale' => 'S.', |
|
| 175 | + 'date_jours' => 'dias', |
|
| 176 | + 'date_minutes' => 'minutos', |
|
| 177 | + 'date_mois' => 'meses', |
|
| 178 | + 'date_mois_1' => 'Janeiro', |
|
| 179 | + 'date_mois_10' => 'Outubro', |
|
| 180 | + 'date_mois_10_abbr' => 'Out.', |
|
| 181 | + 'date_mois_11' => 'Novembro', |
|
| 182 | + 'date_mois_11_abbr' => 'Nov.', |
|
| 183 | + 'date_mois_12' => 'Dezembro', |
|
| 184 | + 'date_mois_12_abbr' => 'Dez.', |
|
| 185 | + 'date_mois_1_abbr' => 'Jan.', |
|
| 186 | + 'date_mois_2' => 'Fevereiro', |
|
| 187 | + 'date_mois_2_abbr' => 'Feb.', |
|
| 188 | + 'date_mois_3' => 'Março', |
|
| 189 | + 'date_mois_3_abbr' => 'Mar', |
|
| 190 | + 'date_mois_4' => 'Abril', |
|
| 191 | + 'date_mois_4_abbr' => 'Abr.', |
|
| 192 | + 'date_mois_5' => 'Maio', |
|
| 193 | + 'date_mois_5_abbr' => 'Mai', |
|
| 194 | + 'date_mois_6' => 'Junho', |
|
| 195 | + 'date_mois_6_abbr' => 'Jun', |
|
| 196 | + 'date_mois_7' => 'Julho', |
|
| 197 | + 'date_mois_7_abbr' => 'Jul', |
|
| 198 | + 'date_mois_8' => 'Agosto', |
|
| 199 | + 'date_mois_8_abbr' => 'Ago', |
|
| 200 | + 'date_mois_9' => 'Setembro', |
|
| 201 | + 'date_mois_9_abbr' => 'Set', |
|
| 202 | + 'date_saison_1' => 'inverno', |
|
| 203 | + 'date_saison_2' => 'primavera', |
|
| 204 | + 'date_saison_3' => 'verão', |
|
| 205 | + 'date_saison_4' => 'outono', |
|
| 206 | + 'date_secondes' => 'segundos', |
|
| 207 | + 'date_semaines' => 'semanas', |
|
| 208 | + 'date_un_mois' => 'mês', |
|
| 209 | + 'date_une_heure' => 'hora', |
|
| 210 | + 'date_une_minute' => 'minuto', |
|
| 211 | + 'date_une_seconde' => 'segundo', |
|
| 212 | + 'date_une_semaine' => 'semana', |
|
| 213 | + 'dirs_commencer' => 'a fim de começar realmente a instalação', |
|
| 214 | + 'dirs_preliminaire' => 'Preliminar : <b>Configurar os direitos de acesso</b>', |
|
| 215 | + 'dirs_probleme_droits' => 'Problema de direitos de acesso', |
|
| 216 | + 'dirs_repertoires_absents' => '<b>Os seguintes directórios não foram encontrados : <ul>@bad_dirs@.</ul> </b> |
|
| 217 | 217 | <p>É provável que resulte de um problema de má colocação de maiúsculas ou minúsculas. |
| 218 | 218 | Verifique que as minúsculas e maiúsculas destes directórios concordam com o que está exibido |
| 219 | 219 | acima; se não for o caso, renomeie os repertórios com o seu software FTP de modo a corrigir o erro. |
| 220 | 220 | <p>Terminada esta operação, poderá</p>', |
| 221 | - 'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b> |
|
| 221 | + 'dirs_repertoires_suivants' => '<b>Os seguintes directórios não estão acessíveis para escrita: <ul>@bad_dirs@.</ul> </b> |
|
| 222 | 222 | <p>Para corrigir, utilize o seu programa de FTP para configurar os direitos de acesso de cada um |
| 223 | 223 | destes directórios. O procedimento está explicado em detalhe no manual de instalação. |
| 224 | 224 | <p>Uma vez efectuada esta alteração, poderá', |
| 225 | - 'double_occurrence' => 'Dupla ocorrência de @balise@', |
|
| 225 | + 'double_occurrence' => 'Dupla ocorrência de @balise@', |
|
| 226 | 226 | |
| 227 | - // E |
|
| 228 | - 'en_cours' => 'em curso', |
|
| 229 | - 'envoi_via_le_site' => 'Envio pelo sítio', |
|
| 230 | - 'erreur' => 'Erro', |
|
| 231 | - 'erreur_balise_non_fermee' => 'última tag não fechada :', |
|
| 232 | - 'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.', |
|
| 233 | - 'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.', |
|
| 234 | - 'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.', |
|
| 235 | - 'erreur_texte' => 'erro(s)', |
|
| 236 | - 'etape' => 'Etapa', |
|
| 227 | + // E |
|
| 228 | + 'en_cours' => 'em curso', |
|
| 229 | + 'envoi_via_le_site' => 'Envio pelo sítio', |
|
| 230 | + 'erreur' => 'Erro', |
|
| 231 | + 'erreur_balise_non_fermee' => 'última tag não fechada :', |
|
| 232 | + 'erreur_technique_ajaxform' => 'Ooops. Uum erro inesperado impediu o formulário de ser enviado. Por favor tente novamente.', |
|
| 233 | + 'erreur_technique_enregistrement_champs' => 'Um erro técnico impediu o registo correcto do campo @champs@.', |
|
| 234 | + 'erreur_technique_enregistrement_impossible' => 'Um erro técnico impediu o registo.', |
|
| 235 | + 'erreur_texte' => 'erro(s)', |
|
| 236 | + 'etape' => 'Etapa', |
|
| 237 | 237 | |
| 238 | - // F |
|
| 239 | - 'fichier_introuvable' => 'Ficheiro @fichier@ não localizado', |
|
| 240 | - 'form_auteur_confirmation' => 'Confirme o seu endereço e-mail', |
|
| 241 | - 'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.', |
|
| 242 | - 'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.', |
|
| 243 | - 'form_auteur_mail_confirmation' => 'Olá, |
|
| 238 | + // F |
|
| 239 | + 'fichier_introuvable' => 'Ficheiro @fichier@ não localizado', |
|
| 240 | + 'form_auteur_confirmation' => 'Confirme o seu endereço e-mail', |
|
| 241 | + 'form_auteur_email_modifie' => 'O seu endereço e-mail foi alterado.', |
|
| 242 | + 'form_auteur_envoi_mail_confirmation' => 'Um e-mail de confirmação foi enviado para @email@. Para validar o seu endereço de e-mail, deve abrir o endereço Web mencionado na mensagem.', |
|
| 243 | + 'form_auteur_mail_confirmation' => 'Olá, |
|
| 244 | 244 | |
| 245 | 245 | Pediu para alterar o seu endereço e-mail. Para confirmar o seu novo endereço, precisa de se conectar ao endereço abaixo (caso contrário, o seu pedido será ignorado) : |
| 246 | 246 | |
| 247 | 247 | @url@ |
| 248 | 248 | ', |
| 249 | - 'form_deja_inscrit' => 'Já está inscrito.', |
|
| 250 | - 'form_email_non_valide' => 'O seu endereço email não é válido', |
|
| 251 | - 'form_forum_access_refuse' => 'Você já não tem acesso a este sítio', |
|
| 252 | - 'form_forum_bonjour' => 'Bom dia @nom@,', |
|
| 253 | - 'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@', |
|
| 254 | - 'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual', |
|
| 255 | - 'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.', |
|
| 256 | - 'form_forum_identifiants' => 'Identificadores pessoais', |
|
| 257 | - 'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.', |
|
| 258 | - 'form_forum_login' => 'login:', |
|
| 259 | - 'form_forum_message_auto' => '(esta é uma mensagem automática)', |
|
| 260 | - 'form_forum_pass' => 'palavra-passe', |
|
| 261 | - 'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado', |
|
| 262 | - 'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do "@nom_site_spip@" (@adresse_site@):', |
|
| 263 | - 'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no |
|
| 249 | + 'form_deja_inscrit' => 'Já está inscrito.', |
|
| 250 | + 'form_email_non_valide' => 'O seu endereço email não é válido', |
|
| 251 | + 'form_forum_access_refuse' => 'Você já não tem acesso a este sítio', |
|
| 252 | + 'form_forum_bonjour' => 'Bom dia @nom@,', |
|
| 253 | + 'form_forum_confirmer_email' => 'Para confirmar o seu endereço e-maill, abra esta ligação : @url_confirm@', |
|
| 254 | + 'form_forum_email_deja_enregistre' => 'Este endereço e-mail já está registado,pode portanto utilizar a sua palavra-passe habitual', |
|
| 255 | + 'form_forum_identifiant_mail' => 'O seu novo identificador acabou de lhe ser enviado por email.', |
|
| 256 | + 'form_forum_identifiants' => 'Identificadores pessoais', |
|
| 257 | + 'form_forum_indiquer_nom_email' => 'Indicar aqui o seu nome e o seu endereço email. O seu identificador pessoal ser-lhe-á enviado rapidamente por correio electrónico.', |
|
| 258 | + 'form_forum_login' => 'login:', |
|
| 259 | + 'form_forum_message_auto' => '(esta é uma mensagem automática)', |
|
| 260 | + 'form_forum_pass' => 'palavra-passe', |
|
| 261 | + 'form_forum_probleme_mail' => 'Problema de mail :o identificador não pôde ser enviado', |
|
| 262 | + 'form_forum_voici1' => 'Aqui estão os seus dados para poder aceder ao sítio Internet do "@nom_site_spip@" (@adresse_site@):', |
|
| 263 | + 'form_forum_voici2' => 'Eis os seus identificadores para propor artigos no |
|
| 264 | 264 | sítio "@nom_site_spip@" (@adresse_login@):', |
| 265 | - 'form_indiquer_email' => 'Por favor indique o seu endereço email.', |
|
| 266 | - 'form_indiquer_nom' => 'Por favor indique o seu nome.', |
|
| 267 | - 'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.', |
|
| 268 | - 'form_pet_deja_enregistre' => 'Este sítio já está registado', |
|
| 269 | - 'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.', |
|
| 270 | - 'form_prop_confirmer_envoi' => 'Confirmar o envio', |
|
| 271 | - 'form_prop_description' => 'Descrição/comentário', |
|
| 272 | - 'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.', |
|
| 273 | - 'form_prop_envoyer' => 'Enviar uma mensagem', |
|
| 274 | - 'form_prop_indiquer_email' => 'Por favor indique um endereço email válido', |
|
| 275 | - 'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.', |
|
| 276 | - 'form_prop_indiquer_sujet' => 'Por favor indique um tema', |
|
| 277 | - 'form_prop_message_envoye' => 'Mensagem enviada', |
|
| 278 | - 'form_prop_non_enregistre' => 'A sua proposta não foi registada.', |
|
| 279 | - 'form_prop_sujet' => 'Tema', |
|
| 280 | - 'form_prop_url_site' => 'Endereço (URL) do sítio', |
|
| 281 | - 'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.', |
|
| 282 | - 'forum_par_auteur' => 'por @auteur@', |
|
| 283 | - 'forum_titre_erreur' => 'Erro...', |
|
| 265 | + 'form_indiquer_email' => 'Por favor indique o seu endereço email.', |
|
| 266 | + 'form_indiquer_nom' => 'Por favor indique o seu nome.', |
|
| 267 | + 'form_indiquer_nom_site' => 'Por favor indique o nome do seu sítio.', |
|
| 268 | + 'form_pet_deja_enregistre' => 'Este sítio já está registado', |
|
| 269 | + 'form_pet_signature_pasprise' => 'A sua assinatura não está tomada em conta.', |
|
| 270 | + 'form_prop_confirmer_envoi' => 'Confirmar o envio', |
|
| 271 | + 'form_prop_description' => 'Descrição/comentário', |
|
| 272 | + 'form_prop_enregistre' => 'A sua proposta foi registada. Aparecerá online após a validação pelos responsáveis deste sítio.', |
|
| 273 | + 'form_prop_envoyer' => 'Enviar uma mensagem', |
|
| 274 | + 'form_prop_indiquer_email' => 'Por favor indique um endereço email válido', |
|
| 275 | + 'form_prop_indiquer_nom_site' => 'Por favor indique o nome do sítio.', |
|
| 276 | + 'form_prop_indiquer_sujet' => 'Por favor indique um tema', |
|
| 277 | + 'form_prop_message_envoye' => 'Mensagem enviada', |
|
| 278 | + 'form_prop_non_enregistre' => 'A sua proposta não foi registada.', |
|
| 279 | + 'form_prop_sujet' => 'Tema', |
|
| 280 | + 'form_prop_url_site' => 'Endereço (URL) do sítio', |
|
| 281 | + 'forum_non_inscrit' => 'Não está inscrito, ou o endereço ou a palavra-passe estão errados.', |
|
| 282 | + 'forum_par_auteur' => 'por @auteur@', |
|
| 283 | + 'forum_titre_erreur' => 'Erro...', |
|
| 284 | 284 | |
| 285 | - // I |
|
| 286 | - 'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:', |
|
| 287 | - 'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:', |
|
| 288 | - 'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.', |
|
| 289 | - 'icone_a_suivre' => 'Continua', |
|
| 290 | - 'icone_admin_site' => 'Administração do sítio', |
|
| 291 | - 'icone_agenda' => 'Agenda e correio', |
|
| 292 | - 'icone_aide_ligne' => 'Ajuda', |
|
| 293 | - 'icone_articles' => 'Artigos', |
|
| 294 | - 'icone_auteurs' => 'Autores', |
|
| 295 | - 'icone_brouteur' => 'Navegação rápida', |
|
| 296 | - 'icone_configuration_site' => 'Configuração', |
|
| 297 | - 'icone_configurer_site' => 'Configurar o seu sítio', |
|
| 298 | - 'icone_creer_nouvel_auteur' => 'Criar um novo autor', |
|
| 299 | - 'icone_creer_rubrique' => 'Criar uma rubrica', |
|
| 300 | - 'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica', |
|
| 301 | - 'icone_deconnecter' => 'Sair', |
|
| 302 | - 'icone_discussions' => 'Discussões', |
|
| 303 | - 'icone_doc_rubrique' => 'Documentos das rubricas', |
|
| 304 | - 'icone_ecrire_article' => 'Escrever um novo artigo', |
|
| 305 | - 'icone_edition_site' => 'Edição', |
|
| 306 | - 'icone_gestion_langues' => 'Opções de idiomas', |
|
| 307 | - 'icone_informations_personnelles' => 'Informações pessoais', |
|
| 308 | - 'icone_interface_complet' => 'interface completa', |
|
| 309 | - 'icone_interface_simple' => 'Interface simplificada', |
|
| 310 | - 'icone_maintenance_site' => 'Manutenção do sítio', |
|
| 311 | - 'icone_messagerie_personnelle' => 'Mensagens privadas', |
|
| 312 | - 'icone_repartition_debut' => 'Exibir a distribuição desde o início', |
|
| 313 | - 'icone_rubriques' => 'Rubricas', |
|
| 314 | - 'icone_sauver_site' => 'Cópia de segurança do sítio', |
|
| 315 | - 'icone_site_entier' => 'Todo o sítio', |
|
| 316 | - 'icone_sites_references' => 'Sítios referenciados', |
|
| 317 | - 'icone_statistiques' => 'Estatísticas do sítio', |
|
| 318 | - 'icone_suivi_activite' => 'Acompanhar a actividade do sítio', |
|
| 319 | - 'icone_suivi_actualite' => 'Evolução do sítio', |
|
| 320 | - 'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados', |
|
| 321 | - 'icone_suivi_revisions' => 'Modificações dos artigos', |
|
| 322 | - 'icone_supprimer_document' => 'Suprimir este documento', |
|
| 323 | - 'icone_supprimer_image' => 'Suprimir esta imagem', |
|
| 324 | - 'icone_tous_articles' => 'Todos os seus artigos', |
|
| 325 | - 'icone_tous_auteur' => 'Todos os autores', |
|
| 326 | - 'icone_tous_visiteur' => 'Todos os visitantes', |
|
| 327 | - 'icone_visiter_site' => 'Visitar o sítio público', |
|
| 328 | - 'icone_voir_en_ligne' => 'Ver online', |
|
| 329 | - 'img_indisponible' => 'imagem indisponível', |
|
| 330 | - 'impossible' => 'impossível', |
|
| 331 | - 'info_a_suivre' => 'A SEGUIR »', |
|
| 332 | - 'info_acces_interdit' => 'Acesso proibido', |
|
| 333 | - 'info_acces_refuse' => 'Acesso recusado', |
|
| 334 | - 'info_action' => 'Acção : @action@', |
|
| 335 | - 'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas', |
|
| 336 | - 'info_adresse_non_indiquee' => 'Não indicou endereço a testar !', |
|
| 337 | - 'info_aide' => 'AJUDA', |
|
| 338 | - 'info_ajouter_mot' => 'Acrescentar esta palavra', |
|
| 339 | - 'info_annonce' => 'ANÚNCIO', |
|
| 340 | - 'info_annonces_generales' => 'Anúncios gerais :', |
|
| 341 | - 'info_article_propose' => 'Artigo proposto', |
|
| 342 | - 'info_article_publie' => 'Artigo publicado', |
|
| 343 | - 'info_article_redaction' => 'Artigo em curso de redacção', |
|
| 344 | - 'info_article_refuse' => 'Artigo recusado', |
|
| 345 | - 'info_article_supprime' => 'Artigo suprimido', |
|
| 346 | - 'info_articles' => 'Artigos', |
|
| 347 | - 'info_articles_a_valider' => 'Os artigos a validar', |
|
| 348 | - 'info_articles_nb' => '@nb@ artigos', |
|
| 349 | - 'info_articles_proposes' => 'Artigos propostos', |
|
| 350 | - 'info_articles_un' => '1 artigo', |
|
| 351 | - 'info_auteurs_nombre' => 'autor(es) :', |
|
| 352 | - 'info_authentification_ftp' => 'Autenticação (por FTP)', |
|
| 353 | - 'info_breves_2' => 'notícias', |
|
| 354 | - 'info_breves_nb' => '@nb@ notícias', |
|
| 355 | - 'info_breves_un' => '1 notícia', |
|
| 356 | - 'info_connexion_refusee' => 'Ligação recusada', |
|
| 357 | - 'info_contact_developpeur' => 'Por favor contacte um programador', |
|
| 358 | - 'info_contenance' => 'Este sítio contém:', |
|
| 359 | - 'info_contribution' => 'contribuições de fórum', |
|
| 360 | - 'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.', |
|
| 361 | - 'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a', |
|
| 362 | - 'info_copyright_gpl' => 'sob licença GPL', |
|
| 363 | - 'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF |
|
| 364 | - 'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :', |
|
| 365 | - 'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :', |
|
| 366 | - 'info_creer_vignette' => 'criação automática de miniatura', |
|
| 367 | - 'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.', |
|
| 368 | - 'info_deplier' => 'Desenvolver', |
|
| 369 | - 'info_descriptif_nombre' => 'descritivo(s) :', |
|
| 370 | - 'info_description' => 'Descrição :', |
|
| 371 | - 'info_description_2' => 'Descrição :', |
|
| 372 | - 'info_dimension' => 'Dimensões :', |
|
| 373 | - 'info_documents_nb' => '@nb@ documentos', |
|
| 374 | - 'info_documents_un' => '1 documento', |
|
| 375 | - 'info_ecire_message_prive' => 'Escrever uma mensagem privada', |
|
| 376 | - 'info_email_invalide' => 'Endereço email inválido.', |
|
| 377 | - 'info_en_cours_validation' => 'Os seus artigos em curso de redação', |
|
| 378 | - 'info_en_ligne' => 'Actualmente online:', |
|
| 379 | - 'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor', |
|
| 380 | - 'info_erreur_requete' => 'Erro no pedido :', |
|
| 381 | - 'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...', |
|
| 382 | - 'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)', |
|
| 383 | - 'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br /> |
|
| 285 | + // I |
|
| 286 | + 'ical_texte_rss_articles' => 'O ficheiro «backend» dos artigos deste sítio encontra-se neste endereço:', |
|
| 287 | + 'ical_texte_rss_articles2' => 'Pode igualmente obter os ficheiros «backend» para os artigos de cada rubrica do sítio:', |
|
| 288 | + 'ical_texte_rss_breves' => 'Existe também um ficheiro contendo notícias do sítio. Especificando um número de rubrica, obterá unicamente as notícias dessa rubrica.', |
|
| 289 | + 'icone_a_suivre' => 'Continua', |
|
| 290 | + 'icone_admin_site' => 'Administração do sítio', |
|
| 291 | + 'icone_agenda' => 'Agenda e correio', |
|
| 292 | + 'icone_aide_ligne' => 'Ajuda', |
|
| 293 | + 'icone_articles' => 'Artigos', |
|
| 294 | + 'icone_auteurs' => 'Autores', |
|
| 295 | + 'icone_brouteur' => 'Navegação rápida', |
|
| 296 | + 'icone_configuration_site' => 'Configuração', |
|
| 297 | + 'icone_configurer_site' => 'Configurar o seu sítio', |
|
| 298 | + 'icone_creer_nouvel_auteur' => 'Criar um novo autor', |
|
| 299 | + 'icone_creer_rubrique' => 'Criar uma rubrica', |
|
| 300 | + 'icone_creer_sous_rubrique' => 'Criar uma sub-rubrica', |
|
| 301 | + 'icone_deconnecter' => 'Sair', |
|
| 302 | + 'icone_discussions' => 'Discussões', |
|
| 303 | + 'icone_doc_rubrique' => 'Documentos das rubricas', |
|
| 304 | + 'icone_ecrire_article' => 'Escrever um novo artigo', |
|
| 305 | + 'icone_edition_site' => 'Edição', |
|
| 306 | + 'icone_gestion_langues' => 'Opções de idiomas', |
|
| 307 | + 'icone_informations_personnelles' => 'Informações pessoais', |
|
| 308 | + 'icone_interface_complet' => 'interface completa', |
|
| 309 | + 'icone_interface_simple' => 'Interface simplificada', |
|
| 310 | + 'icone_maintenance_site' => 'Manutenção do sítio', |
|
| 311 | + 'icone_messagerie_personnelle' => 'Mensagens privadas', |
|
| 312 | + 'icone_repartition_debut' => 'Exibir a distribuição desde o início', |
|
| 313 | + 'icone_rubriques' => 'Rubricas', |
|
| 314 | + 'icone_sauver_site' => 'Cópia de segurança do sítio', |
|
| 315 | + 'icone_site_entier' => 'Todo o sítio', |
|
| 316 | + 'icone_sites_references' => 'Sítios referenciados', |
|
| 317 | + 'icone_statistiques' => 'Estatísticas do sítio', |
|
| 318 | + 'icone_suivi_activite' => 'Acompanhar a actividade do sítio', |
|
| 319 | + 'icone_suivi_actualite' => 'Evolução do sítio', |
|
| 320 | + 'icone_suivi_pettions' => 'Seguir/gerir os abaixo-assinados', |
|
| 321 | + 'icone_suivi_revisions' => 'Modificações dos artigos', |
|
| 322 | + 'icone_supprimer_document' => 'Suprimir este documento', |
|
| 323 | + 'icone_supprimer_image' => 'Suprimir esta imagem', |
|
| 324 | + 'icone_tous_articles' => 'Todos os seus artigos', |
|
| 325 | + 'icone_tous_auteur' => 'Todos os autores', |
|
| 326 | + 'icone_tous_visiteur' => 'Todos os visitantes', |
|
| 327 | + 'icone_visiter_site' => 'Visitar o sítio público', |
|
| 328 | + 'icone_voir_en_ligne' => 'Ver online', |
|
| 329 | + 'img_indisponible' => 'imagem indisponível', |
|
| 330 | + 'impossible' => 'impossível', |
|
| 331 | + 'info_a_suivre' => 'A SEGUIR »', |
|
| 332 | + 'info_acces_interdit' => 'Acesso proibido', |
|
| 333 | + 'info_acces_refuse' => 'Acesso recusado', |
|
| 334 | + 'info_action' => 'Acção : @action@', |
|
| 335 | + 'info_administrer_rubriques' => 'Pode administrar esta rubrica e as suas sub-rubricas', |
|
| 336 | + 'info_adresse_non_indiquee' => 'Não indicou endereço a testar !', |
|
| 337 | + 'info_aide' => 'AJUDA', |
|
| 338 | + 'info_ajouter_mot' => 'Acrescentar esta palavra', |
|
| 339 | + 'info_annonce' => 'ANÚNCIO', |
|
| 340 | + 'info_annonces_generales' => 'Anúncios gerais :', |
|
| 341 | + 'info_article_propose' => 'Artigo proposto', |
|
| 342 | + 'info_article_publie' => 'Artigo publicado', |
|
| 343 | + 'info_article_redaction' => 'Artigo em curso de redacção', |
|
| 344 | + 'info_article_refuse' => 'Artigo recusado', |
|
| 345 | + 'info_article_supprime' => 'Artigo suprimido', |
|
| 346 | + 'info_articles' => 'Artigos', |
|
| 347 | + 'info_articles_a_valider' => 'Os artigos a validar', |
|
| 348 | + 'info_articles_nb' => '@nb@ artigos', |
|
| 349 | + 'info_articles_proposes' => 'Artigos propostos', |
|
| 350 | + 'info_articles_un' => '1 artigo', |
|
| 351 | + 'info_auteurs_nombre' => 'autor(es) :', |
|
| 352 | + 'info_authentification_ftp' => 'Autenticação (por FTP)', |
|
| 353 | + 'info_breves_2' => 'notícias', |
|
| 354 | + 'info_breves_nb' => '@nb@ notícias', |
|
| 355 | + 'info_breves_un' => '1 notícia', |
|
| 356 | + 'info_connexion_refusee' => 'Ligação recusada', |
|
| 357 | + 'info_contact_developpeur' => 'Por favor contacte um programador', |
|
| 358 | + 'info_contenance' => 'Este sítio contém:', |
|
| 359 | + 'info_contribution' => 'contribuições de fórum', |
|
| 360 | + 'info_copyright' => '@spip@ é um software livre distribuído @lien_gpl@.', |
|
| 361 | + 'info_copyright_doc' => 'Para mais informações, visite o sítio <a href="@spipnet@">@spipnet_affiche@</a', |
|
| 362 | + 'info_copyright_gpl' => 'sob licença GPL', |
|
| 363 | + 'info_cours_edition' => 'Os seus artigos em curso de redacção', # MODIF |
|
| 364 | + 'info_creer_repertoire' => 'Por favor crie um ficheiro ou um directório chamado :', |
|
| 365 | + 'info_creer_repertoire_2' => 'dentro do sub-directório <b>@repertoire@</b>, depois :', |
|
| 366 | + 'info_creer_vignette' => 'criação automática de miniatura', |
|
| 367 | + 'info_creerdansrubrique_non_autorise' => 'Não tem direitos suficientes para criar conteúdo nesta rubrica.', |
|
| 368 | + 'info_deplier' => 'Desenvolver', |
|
| 369 | + 'info_descriptif_nombre' => 'descritivo(s) :', |
|
| 370 | + 'info_description' => 'Descrição :', |
|
| 371 | + 'info_description_2' => 'Descrição :', |
|
| 372 | + 'info_dimension' => 'Dimensões :', |
|
| 373 | + 'info_documents_nb' => '@nb@ documentos', |
|
| 374 | + 'info_documents_un' => '1 documento', |
|
| 375 | + 'info_ecire_message_prive' => 'Escrever uma mensagem privada', |
|
| 376 | + 'info_email_invalide' => 'Endereço email inválido.', |
|
| 377 | + 'info_en_cours_validation' => 'Os seus artigos em curso de redação', |
|
| 378 | + 'info_en_ligne' => 'Actualmente online:', |
|
| 379 | + 'info_envoyer_message_prive' => 'Enviar uma mensagem privada a este autor', |
|
| 380 | + 'info_erreur_requete' => 'Erro no pedido :', |
|
| 381 | + 'info_erreur_squelette2' => 'Modelo <b>@fichier@</b> não disponível...', |
|
| 382 | + 'info_erreur_systeme' => 'Erro de Sistema (errno @errsys@)', |
|
| 383 | + 'info_erreur_systeme2' => 'O disco rígido poderá estar cheio, ou a base de dados danificada.<br /> |
|
| 384 | 384 | <span style="color:red;">Tente <a href=\'@script@\'>reparar a base de dados </a>, ou contacte o seu fornecedor de internet.</span>', |
| 385 | - 'info_fini' => 'Terminou !', |
|
| 386 | - 'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.', |
|
| 387 | - 'info_format_non_defini' => 'formato não definido', |
|
| 388 | - 'info_grand_ecran' => 'Ecrã total', |
|
| 389 | - 'info_image_aide' => 'AJUDA', |
|
| 390 | - 'info_image_process_titre' => 'Como criar miniaturas', |
|
| 391 | - 'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>', |
|
| 392 | - 'info_installation_systeme_publication' => 'Instalação do sistema de publicação', |
|
| 393 | - 'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.', |
|
| 394 | - 'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.', |
|
| 395 | - 'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.', |
|
| 396 | - 'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.', |
|
| 397 | - 'info_interface_complete' => 'Interface completa', |
|
| 398 | - 'info_interface_simple' => 'Interface simplificada', |
|
| 399 | - 'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo', |
|
| 400 | - 'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo', |
|
| 401 | - 'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :', |
|
| 402 | - 'info_l_article' => 'o artigo', |
|
| 403 | - 'info_la_breve' => 'a notícia', |
|
| 404 | - 'info_la_rubrique' => 'a rubrica', |
|
| 405 | - 'info_langue_principale' => 'Idioma principal do sítio', |
|
| 406 | - 'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels', |
|
| 407 | - 'info_les_auteurs_1' => 'por @les_auteurs@', |
|
| 408 | - 'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.', |
|
| 409 | - 'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).', |
|
| 410 | - 'info_mail_fournisseur' => 'você@seucorreio.com', |
|
| 411 | - 'info_message_2' => 'MENSAGEM', |
|
| 412 | - 'info_message_supprime' => 'MENSAGEM ELIMINADA', |
|
| 413 | - 'info_messages_nb' => '@nb@ mensagens', |
|
| 414 | - 'info_messages_un' => '1 mensagem', |
|
| 415 | - 'info_mise_en_ligne' => 'Data de colocação online :', |
|
| 416 | - 'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança', |
|
| 417 | - 'info_mois_courant' => 'Durante o mês :', |
|
| 418 | - 'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a', |
|
| 419 | - 'info_multi_herit' => 'Idioma por defeito', |
|
| 420 | - 'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.', |
|
| 421 | - 'info_multilinguisme' => 'Multilinguismo', |
|
| 422 | - 'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.', |
|
| 423 | - 'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.', |
|
| 424 | - 'info_nombre_en_ligne' => 'Actualmente online :', |
|
| 425 | - 'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"', |
|
| 426 | - 'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.', |
|
| 427 | - 'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM', |
|
| 428 | - 'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS', |
|
| 429 | - 'info_numero_abbreviation' => '<N° >', |
|
| 430 | - 'info_obligatoire' => 'Esta informação é obrigatória', |
|
| 431 | - 'info_pense_bete' => 'MEMORANDO', |
|
| 432 | - 'info_petit_ecran' => 'Ecrã Pequeno', |
|
| 433 | - 'info_petition_close' => 'Petição encerrada', |
|
| 434 | - 'info_pixels' => 'pixels', |
|
| 435 | - 'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":', |
|
| 436 | - 'info_portfolio_automatique' => 'Portfolio automático :', |
|
| 437 | - 'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]', |
|
| 438 | - 'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]', |
|
| 439 | - 'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@', |
|
| 440 | - 'info_propose_2' => 'Artigos propostos |
|
| 385 | + 'info_fini' => 'Terminou !', |
|
| 386 | + 'info_format_image' => 'Formatos de imagens que podem ser utilizadas para criar vinhetas : @gd_formats@.', |
|
| 387 | + 'info_format_non_defini' => 'formato não definido', |
|
| 388 | + 'info_grand_ecran' => 'Ecrã total', |
|
| 389 | + 'info_image_aide' => 'AJUDA', |
|
| 390 | + 'info_image_process_titre' => 'Como criar miniaturas', |
|
| 391 | + 'info_impossible_lire_page' => '<b>Erro !</b> Impossível ler a página<tt><html>@test_proxy@</html></tt> através do proxy <tt>', |
|
| 392 | + 'info_installation_systeme_publication' => 'Instalação do sistema de publicação', |
|
| 393 | + 'info_installer_documents' => 'Pode instalar automaticamente todos os documentos contidos na pasta @upload@.', |
|
| 394 | + 'info_installer_ftp' => 'Como administrador, pode instalar (por FTP) ficheiros na pasta @upload@ para depois seleccioná-los directamente aqui.', |
|
| 395 | + 'info_installer_images' => 'Pode instalar imagens nos formatos JPEG, GIF e PNG.', |
|
| 396 | + 'info_installer_images_dossier' => 'Instalar imagens na pasta @upload@ para poder seleccioná-los aqui.', |
|
| 397 | + 'info_interface_complete' => 'Interface completa', |
|
| 398 | + 'info_interface_simple' => 'Interface simplificada', |
|
| 399 | + 'info_joindre_document_article' => 'Pode juntar a este artigo documentos de tipo', |
|
| 400 | + 'info_joindre_document_rubrique' => 'Pode acrescentar a esta rubrica documentos de tipo', |
|
| 401 | + 'info_joindre_documents_article' => 'Pode juntar ao seu artigo documentos de tipo :', |
|
| 402 | + 'info_l_article' => 'o artigo', |
|
| 403 | + 'info_la_breve' => 'a notícia', |
|
| 404 | + 'info_la_rubrique' => 'a rubrica', |
|
| 405 | + 'info_langue_principale' => 'Idioma principal do sítio', |
|
| 406 | + 'info_largeur_vignette' => '@largeur_vignette@ x @hauteur_vignette@ pixels', |
|
| 407 | + 'info_les_auteurs_1' => 'por @les_auteurs@', |
|
| 408 | + 'info_logo_format_interdit' => 'Apenas os ícones nos formatos @formats@ estão autorizados.', |
|
| 409 | + 'info_logo_max_poids' => 'Os ícones devem obrigatoriamente ter menos de @maxi@ (este arquivo tem @actuel@).', |
|
| 410 | + 'info_mail_fournisseur' => 'você@seucorreio.com', |
|
| 411 | + 'info_message_2' => 'MENSAGEM', |
|
| 412 | + 'info_message_supprime' => 'MENSAGEM ELIMINADA', |
|
| 413 | + 'info_messages_nb' => '@nb@ mensagens', |
|
| 414 | + 'info_messages_un' => '1 mensagem', |
|
| 415 | + 'info_mise_en_ligne' => 'Data de colocação online :', |
|
| 416 | + 'info_modification_parametres_securite' => 'modificação dos parâmetros de segurança', |
|
| 417 | + 'info_mois_courant' => 'Durante o mês :', |
|
| 418 | + 'info_mot_cle_ajoute' => 'A seguinte palavra-chave foi acrescentada a', |
|
| 419 | + 'info_multi_herit' => 'Idioma por defeito', |
|
| 420 | + 'info_multi_langues_soulignees' => 'Os <u>idiomas sublinhadas</u> beneficiam de uma tradução de todos os textos da interface. Se seleccionar esses idiomas, muitos elementos do sítio público (datas, formulários) serão automaticamente traduzidos. Para os idiomas não sublinhadas, esses elementos aparecerão no idioma principal do sítio.', |
|
| 421 | + 'info_multilinguisme' => 'Multilinguismo', |
|
| 422 | + 'info_nom_non_utilisateurs_connectes' => 'O seu nome não aparece na lista dos utilizadores ligados.', |
|
| 423 | + 'info_nom_utilisateurs_connectes' => 'O seu nome aparece na lista dos utilizadores ligados.', |
|
| 424 | + 'info_nombre_en_ligne' => 'Actualmente online :', |
|
| 425 | + 'info_non_resultat' => 'Nenhum resultado para "@cherche_mot@"', |
|
| 426 | + 'info_non_utilisation_messagerie' => 'Não utiliza o correio interno deste sítio.', |
|
| 427 | + 'info_nouveau_message' => 'TEM UMA NOVA MENSAGEM', |
|
| 428 | + 'info_nouveaux_messages' => 'TEM @total_messages@ NOVAS MENSAGENS', |
|
| 429 | + 'info_numero_abbreviation' => '<N° >', |
|
| 430 | + 'info_obligatoire' => 'Esta informação é obrigatória', |
|
| 431 | + 'info_pense_bete' => 'MEMORANDO', |
|
| 432 | + 'info_petit_ecran' => 'Ecrã Pequeno', |
|
| 433 | + 'info_petition_close' => 'Petição encerrada', |
|
| 434 | + 'info_pixels' => 'pixels', |
|
| 435 | + 'info_plusieurs_mots_trouves' => 'Muitas palavras-chave encontradas para "@cherche_mot@":', |
|
| 436 | + 'info_portfolio_automatique' => 'Portfolio automático :', |
|
| 437 | + 'info_premier_resultat' => '[@debut_limit@ primeiros resultados em @total@]', |
|
| 438 | + 'info_premier_resultat_sur' => '[@debut_limit@ primeiros resultados em @total@]', |
|
| 439 | + 'info_propose_1' => '[@nom_site_spip@] Proposto : @titre@', |
|
| 440 | + 'info_propose_2' => 'Artigos propostos |
|
| 441 | 441 | ----------------', |
| 442 | - 'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.', |
|
| 443 | - 'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião', |
|
| 444 | - 'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:', |
|
| 445 | - 'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.', |
|
| 446 | - 'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@', |
|
| 447 | - 'info_publie_2' => 'Artigo publicado |
|
| 442 | + 'info_propose_3' => 'O artigo "@titre@" é proposto para publicação.', |
|
| 443 | + 'info_propose_4' => 'Está convidado a vir consultá-lo e a dar a sua opinião', |
|
| 444 | + 'info_propose_5' => 'no fórum que lhe está ligado. Está disponível no endereço:', |
|
| 445 | + 'info_publie_01' => 'O artigo "@titre@" foi validado por @connect_nom@.', |
|
| 446 | + 'info_publie_1' => '[@nom_site_spip@] PUBLICADO : @titre@', |
|
| 447 | + 'info_publie_2' => 'Artigo publicado |
|
| 448 | 448 | --------------', |
| 449 | - 'info_rechercher' => 'Procurar', |
|
| 450 | - 'info_rechercher_02' => 'Procurar :', |
|
| 451 | - 'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :', |
|
| 452 | - 'info_rubriques_nb' => '@nb@ rubricas', |
|
| 453 | - 'info_rubriques_un' => '1 rubrica', |
|
| 454 | - 'info_sans_titre_2' => 'sem título', |
|
| 455 | - 'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@', |
|
| 456 | - 'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :', |
|
| 457 | - 'info_sites_nb' => '@nb@ sítios', |
|
| 458 | - 'info_sites_un' => '1 sítio', |
|
| 459 | - 'info_supprimer_vignette' => 'suprimir a miniatura', |
|
| 460 | - 'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.', |
|
| 461 | - 'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.', |
|
| 462 | - 'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.', |
|
| 463 | - 'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :', |
|
| 464 | - 'info_telecharger_ordinateur' => 'Telecarregar do seu computador :', |
|
| 465 | - 'info_tous_resultats_enregistres' => '[todos os resultados estão registados]', |
|
| 466 | - 'info_tout_afficher' => 'Exibir tudo', |
|
| 467 | - 'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...', |
|
| 468 | - 'info_travaux_titre' => 'Sítio em construção', |
|
| 469 | - 'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.', |
|
| 470 | - 'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.', |
|
| 471 | - 'info_valider_lien' => 'validar esta ligação', |
|
| 472 | - 'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.', |
|
| 473 | - 'info_vignette_defaut' => 'Miniatura por defeito', |
|
| 474 | - 'info_vignette_personnalisee' => 'Miniatura personalizada', |
|
| 475 | - 'info_visite' => 'visita :', |
|
| 476 | - 'info_vos_rendez_vous' => 'Os seus futuros encontros', |
|
| 477 | - 'infos_vos_pense_bete' => 'Os seus memorandos', |
|
| 449 | + 'info_rechercher' => 'Procurar', |
|
| 450 | + 'info_rechercher_02' => 'Procurar :', |
|
| 451 | + 'info_remplacer_vignette' => 'Substituir a miniatura por defeito por um logotipo personalizado :', |
|
| 452 | + 'info_rubriques_nb' => '@nb@ rubricas', |
|
| 453 | + 'info_rubriques_un' => '1 rubrica', |
|
| 454 | + 'info_sans_titre_2' => 'sem título', |
|
| 455 | + 'info_selectionner_fichier' => 'Pode seleccionar um ficheiro da pasta @upload@', |
|
| 456 | + 'info_selectionner_fichier_2' => 'Seleccionar um ficheiro :', |
|
| 457 | + 'info_sites_nb' => '@nb@ sítios', |
|
| 458 | + 'info_sites_un' => '1 sítio', |
|
| 459 | + 'info_supprimer_vignette' => 'suprimir a miniatura', |
|
| 460 | + 'info_symbole_bleu' => 'O símbolo <b>azul</b> indica um<b>memorando </b>: isto é uma mensagem para o seu uso pessoal.', |
|
| 461 | + 'info_symbole_jaune' => 'O símbolo<b>amarelo</b> indica um <b>anúncio a todos os redactores</b> : modificável por todos os administradores, e visível por todos os redactores.', |
|
| 462 | + 'info_symbole_vert' => 'O símbolo<b>verde</b> indica as <b>mensagens trocadas com outros utilizadores</b> do sítio.', |
|
| 463 | + 'info_telecharger_nouveau_logo' => 'Telecarregar um novo logotipo :', |
|
| 464 | + 'info_telecharger_ordinateur' => 'Telecarregar do seu computador :', |
|
| 465 | + 'info_tous_resultats_enregistres' => '[todos os resultados estão registados]', |
|
| 466 | + 'info_tout_afficher' => 'Exibir tudo', |
|
| 467 | + 'info_travaux_texte' => 'Este sítio ainda não está configurado. Volte mais tarde...', |
|
| 468 | + 'info_travaux_titre' => 'Sítio em construção', |
|
| 469 | + 'info_trop_resultat' => 'Demasiado resultados para "@cherche_mot@". Por favor afine a pesquisa.', |
|
| 470 | + 'info_utilisation_messagerie_interne' => 'Você utiliza o correio interno deste sítio.', |
|
| 471 | + 'info_valider_lien' => 'validar esta ligação', |
|
| 472 | + 'info_verifier_image' => ', Por favor verifique se as suas imagens foram transferidas correctamente.', |
|
| 473 | + 'info_vignette_defaut' => 'Miniatura por defeito', |
|
| 474 | + 'info_vignette_personnalisee' => 'Miniatura personalizada', |
|
| 475 | + 'info_visite' => 'visita :', |
|
| 476 | + 'info_vos_rendez_vous' => 'Os seus futuros encontros', |
|
| 477 | + 'infos_vos_pense_bete' => 'Os seus memorandos', |
|
| 478 | 478 | |
| 479 | - // L |
|
| 480 | - 'label_ajout_id_rapide' => 'Adição rápida', |
|
| 481 | - 'label_poids_fichier' => 'Dimensões', |
|
| 482 | - 'lien_afficher_icones_seuls' => 'Exibir apenas os ícones', |
|
| 483 | - 'lien_afficher_texte_icones' => 'Exibir ícones e o texto', |
|
| 484 | - 'lien_afficher_texte_seul' => 'Exibir apenas o texto', |
|
| 485 | - 'lien_liberer' => 'desbloquear', |
|
| 486 | - 'lien_liberer_tous' => 'desbloquear estes artigos', |
|
| 487 | - 'lien_nouvea_pense_bete' => 'NOVO MEMORANDO', |
|
| 488 | - 'lien_nouveau_message' => 'NOVA MENSAGEM', |
|
| 489 | - 'lien_nouvelle_annonce' => 'NOVO ANÚNCIO', |
|
| 490 | - 'lien_petitions' => 'PETIÇÃO', |
|
| 491 | - 'lien_popularite' => 'popularidade : @popularite@%', |
|
| 492 | - 'lien_racine_site' => 'RAIZ DO SÍTIO', |
|
| 493 | - 'lien_reessayer' => 'tentar de novo', |
|
| 494 | - 'lien_repondre_message' => 'Responder a esta mensagem', |
|
| 495 | - 'lien_supprimer' => 'eliminar', |
|
| 496 | - 'lien_tout_afficher' => 'Exibir tudo', |
|
| 497 | - 'lien_visite_site' => 'visitar este sítio', |
|
| 498 | - 'lien_visites' => '@visites@ visitas', |
|
| 499 | - 'lien_voir_auteur' => 'Ver este autor', |
|
| 500 | - 'ligne' => 'Linha', |
|
| 501 | - 'login' => 'Ligação', |
|
| 502 | - 'login_acces_prive' => 'acesso ao espaço privado', |
|
| 503 | - 'login_autre_identifiant' => 'ligar-se sob um outro identificador', |
|
| 504 | - 'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).', |
|
| 505 | - 'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.', |
|
| 506 | - 'login_deconnexion_ok' => 'Ligação terminada.', |
|
| 507 | - 'login_erreur_pass' => 'Erro de palavra-passe', |
|
| 508 | - 'login_espace_prive' => 'área privada', |
|
| 509 | - 'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.', |
|
| 510 | - 'login_login' => 'Login :', |
|
| 511 | - 'login_login2' => 'Login ou endereço de e-mail :', |
|
| 512 | - 'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)', |
|
| 513 | - 'login_motpasseoublie' => 'palavra - passe esquecida ?', |
|
| 514 | - 'login_non_securise' => 'Atenção, este formulário não é seguro. |
|
| 479 | + // L |
|
| 480 | + 'label_ajout_id_rapide' => 'Adição rápida', |
|
| 481 | + 'label_poids_fichier' => 'Dimensões', |
|
| 482 | + 'lien_afficher_icones_seuls' => 'Exibir apenas os ícones', |
|
| 483 | + 'lien_afficher_texte_icones' => 'Exibir ícones e o texto', |
|
| 484 | + 'lien_afficher_texte_seul' => 'Exibir apenas o texto', |
|
| 485 | + 'lien_liberer' => 'desbloquear', |
|
| 486 | + 'lien_liberer_tous' => 'desbloquear estes artigos', |
|
| 487 | + 'lien_nouvea_pense_bete' => 'NOVO MEMORANDO', |
|
| 488 | + 'lien_nouveau_message' => 'NOVA MENSAGEM', |
|
| 489 | + 'lien_nouvelle_annonce' => 'NOVO ANÚNCIO', |
|
| 490 | + 'lien_petitions' => 'PETIÇÃO', |
|
| 491 | + 'lien_popularite' => 'popularidade : @popularite@%', |
|
| 492 | + 'lien_racine_site' => 'RAIZ DO SÍTIO', |
|
| 493 | + 'lien_reessayer' => 'tentar de novo', |
|
| 494 | + 'lien_repondre_message' => 'Responder a esta mensagem', |
|
| 495 | + 'lien_supprimer' => 'eliminar', |
|
| 496 | + 'lien_tout_afficher' => 'Exibir tudo', |
|
| 497 | + 'lien_visite_site' => 'visitar este sítio', |
|
| 498 | + 'lien_visites' => '@visites@ visitas', |
|
| 499 | + 'lien_voir_auteur' => 'Ver este autor', |
|
| 500 | + 'ligne' => 'Linha', |
|
| 501 | + 'login' => 'Ligação', |
|
| 502 | + 'login_acces_prive' => 'acesso ao espaço privado', |
|
| 503 | + 'login_autre_identifiant' => 'ligar-se sob um outro identificador', |
|
| 504 | + 'login_cookie_accepte' => 'Por favor configure o seu navegador para que os aceite (pelo menos para este sítio).', |
|
| 505 | + 'login_cookie_oblige' => 'Para se identificar de maneira segura neste sítio, deve aceitar os cookies.', |
|
| 506 | + 'login_deconnexion_ok' => 'Ligação terminada.', |
|
| 507 | + 'login_erreur_pass' => 'Erro de palavra-passe', |
|
| 508 | + 'login_espace_prive' => 'área privada', |
|
| 509 | + 'login_identifiant_inconnu' => 'O identificador « @login@ » é desconhecido.', |
|
| 510 | + 'login_login' => 'Login :', |
|
| 511 | + 'login_login2' => 'Login ou endereço de e-mail :', |
|
| 512 | + 'login_login_pass_incorrect' => '(Login ou palavra-passe incorrecta.)', |
|
| 513 | + 'login_motpasseoublie' => 'palavra - passe esquecida ?', |
|
| 514 | + 'login_non_securise' => 'Atenção, este formulário não é seguro. |
|
| 515 | 515 | Se não quiser que a sua palavra-passe seja |
| 516 | 516 | interceptada na rede, por favor active Javascript |
| 517 | 517 | no seu navegador e', |
| 518 | - 'login_nouvelle_tentative' => 'Nova tentativa', |
|
| 519 | - 'login_par_ici' => 'Você está registado... por aqui....', |
|
| 520 | - 'login_pass2' => 'Palavra-passe :', |
|
| 521 | - 'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição', |
|
| 522 | - 'login_recharger' => 'carregar de novo esta página ', |
|
| 523 | - 'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF |
|
| 524 | - 'login_retour_public' => 'Regresso ao sítio público', |
|
| 525 | - 'login_retour_site' => 'Regresso ao sítio público', |
|
| 526 | - 'login_retoursitepublic' => 'Regresso ao sítio público', |
|
| 527 | - 'login_securise' => 'Login seguro', |
|
| 528 | - 'login_sinscrire' => 'inscrever-se', |
|
| 529 | - 'login_test_navigateur' => 'teste navegação/nova ligação', |
|
| 530 | - 'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)', |
|
| 518 | + 'login_nouvelle_tentative' => 'Nova tentativa', |
|
| 519 | + 'login_par_ici' => 'Você está registado... por aqui....', |
|
| 520 | + 'login_pass2' => 'Palavra-passe :', |
|
| 521 | + 'login_preferez_refuser' => '<b>Se prefere recusar os cookies</b>, um outro método de ligação (menos seguro) está à sua disposição', |
|
| 522 | + 'login_recharger' => 'carregar de novo esta página ', |
|
| 523 | + 'login_rester_identifie' => 'Permanecer identificado durante alguns dias ', # MODIF |
|
| 524 | + 'login_retour_public' => 'Regresso ao sítio público', |
|
| 525 | + 'login_retour_site' => 'Regresso ao sítio público', |
|
| 526 | + 'login_retoursitepublic' => 'Regresso ao sítio público', |
|
| 527 | + 'login_securise' => 'Login seguro', |
|
| 528 | + 'login_sinscrire' => 'inscrever-se', |
|
| 529 | + 'login_test_navigateur' => 'teste navegação/nova ligação', |
|
| 530 | + 'login_verifiez_navigateur' => '(Verifique, porém, que o seu navegador não memorizou a sua palavra-passe...)', |
|
| 531 | 531 | |
| 532 | - // M |
|
| 533 | - 'masquer_colonne' => 'Ocultar esta coluna', |
|
| 534 | - 'masquer_trad' => 'ocultar as traduções', |
|
| 535 | - 'module_fichiers_langues' => 'Ficheiros de idioma', |
|
| 532 | + // M |
|
| 533 | + 'masquer_colonne' => 'Ocultar esta coluna', |
|
| 534 | + 'masquer_trad' => 'ocultar as traduções', |
|
| 535 | + 'module_fichiers_langues' => 'Ficheiros de idioma', |
|
| 536 | 536 | |
| 537 | - // N |
|
| 538 | - 'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.', |
|
| 539 | - 'numero' => 'Número', |
|
| 537 | + // N |
|
| 538 | + 'navigateur_pas_redirige' => 'Se o seu navegador não está redireccionado, clique aqui para continuar.', |
|
| 539 | + 'numero' => 'Número', |
|
| 540 | 540 | |
| 541 | - // O |
|
| 542 | - 'occurence' => 'Ocorrência', |
|
| 543 | - 'onglet_affacer_base' => 'Apagar a base de dados', |
|
| 544 | - 'onglet_auteur' => 'O autor', |
|
| 545 | - 'onglet_contenu_site' => 'Conteúdo do sítio', |
|
| 546 | - 'onglet_evolution_visite_mod' => 'Evolução', |
|
| 547 | - 'onglet_fonctions_avances' => 'Funções avançadas', |
|
| 548 | - 'onglet_informations_personnelles' => 'Informações pessoais', |
|
| 549 | - 'onglet_interactivite' => 'Interactividade', |
|
| 550 | - 'onglet_messagerie' => 'Correio', |
|
| 551 | - 'onglet_repartition_rubrique' => 'Distribuição das rubricas', |
|
| 552 | - 'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base', |
|
| 553 | - 'onglet_vider_cache' => 'Esvaziar a cache', |
|
| 541 | + // O |
|
| 542 | + 'occurence' => 'Ocorrência', |
|
| 543 | + 'onglet_affacer_base' => 'Apagar a base de dados', |
|
| 544 | + 'onglet_auteur' => 'O autor', |
|
| 545 | + 'onglet_contenu_site' => 'Conteúdo do sítio', |
|
| 546 | + 'onglet_evolution_visite_mod' => 'Evolução', |
|
| 547 | + 'onglet_fonctions_avances' => 'Funções avançadas', |
|
| 548 | + 'onglet_informations_personnelles' => 'Informações pessoais', |
|
| 549 | + 'onglet_interactivite' => 'Interactividade', |
|
| 550 | + 'onglet_messagerie' => 'Correio', |
|
| 551 | + 'onglet_repartition_rubrique' => 'Distribuição das rubricas', |
|
| 552 | + 'onglet_save_restaur_base' => 'Guardar uma cópia/restaurar a base', |
|
| 553 | + 'onglet_vider_cache' => 'Esvaziar a cache', |
|
| 554 | 554 | |
| 555 | - // P |
|
| 556 | - 'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe', |
|
| 557 | - 'pass_erreur' => 'Erro', |
|
| 558 | - 'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.', |
|
| 559 | - 'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.', |
|
| 560 | - 'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ', |
|
| 561 | - 'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido ! ', |
|
| 562 | - 'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.', |
|
| 563 | - 'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos |
|
| 555 | + // P |
|
| 556 | + 'pass_choix_pass' => 'Por favor escolha a sua nova palavra-passe', |
|
| 557 | + 'pass_erreur' => 'Erro', |
|
| 558 | + 'pass_erreur_acces_refuse' => '<b>Erro :</b> já não tem acesso a este sítio.', |
|
| 559 | + 'pass_erreur_code_inconnu' => '<b>Erro :</b> este código não corresponde a nenhum dos visitantes com acesso a este sítio.', |
|
| 560 | + 'pass_erreur_non_enregistre' => '<b>Erro :</b> o endereço <tt>@email_oubli@</tt> não está registado neste sítio. ', |
|
| 561 | + 'pass_erreur_non_valide' => '<b>Erro :</b> este email <tt>@email_oubli@</tt> não é válido ! ', |
|
| 562 | + 'pass_erreur_probleme_technique' => '<b>Erro :</b> por causa de um problema técnico, o email não pôde ser enviado.', |
|
| 563 | + 'pass_espace_prive_bla' => 'O espaço privado deste sítio está aberto aos |
|
| 564 | 564 | visitantes, após inscrição. Uma vez registado poderá consultar os artigos em curso de redacção, |
| 565 | 565 | propor artigos e participar em todos os fóruns.', |
| 566 | - 'pass_forum_bla' => 'Pediu para intervir num fórum |
|
| 566 | + 'pass_forum_bla' => 'Pediu para intervir num fórum |
|
| 567 | 567 | reservado aos visitadores registados.', |
| 568 | - 'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá |
|
| 568 | + 'pass_indiquez_cidessous' => 'Indique abaixo o endereço email sob o qual se registou. Receberá |
|
| 569 | 569 | um mail que indicará o procedimento a seguir para |
| 570 | 570 | recuperar o seu acesso.', |
| 571 | - 'pass_mail_passcookie' => '(esta é uma mensagem automática) |
|
| 571 | + 'pass_mail_passcookie' => '(esta é uma mensagem automática) |
|
| 572 | 572 | Para recuperar o seu acesso ao sítio |
| 573 | 573 | @nom_site_spip@ (@adresse_site@) |
| 574 | 574 | |
@@ -578,136 +578,136 @@ discard block |
||
| 578 | 578 | |
| 579 | 579 | Poderá então introduzir uma nova palavra-passe e reconectar-se ao sítio. |
| 580 | 580 | ', |
| 581 | - 'pass_mot_oublie' => 'Palavra-passe esquecida', |
|
| 582 | - 'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada', |
|
| 583 | - 'pass_nouveau_pass' => 'Nova palavra-passe', |
|
| 584 | - 'pass_ok' => 'OK', |
|
| 585 | - 'pass_oubli_mot' => 'Palavra-passe esquecida', |
|
| 586 | - 'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF |
|
| 587 | - 'pass_quitter_fenetre' => 'Fechar esta janela', |
|
| 588 | - 'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».', |
|
| 589 | - 'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF |
|
| 590 | - 'pass_retour_public' => 'Regresso ao sítio público', |
|
| 591 | - 'pass_rien_a_faire_ici' => 'Nada a fazer aqui.', |
|
| 592 | - 'pass_vousinscrire' => 'Inscrever-se neste sítio', |
|
| 593 | - 'precedent' => 'anterior', |
|
| 594 | - 'previsualisation' => 'Visualização', |
|
| 595 | - 'previsualiser' => 'Pré-visualizar', |
|
| 581 | + 'pass_mot_oublie' => 'Palavra-passe esquecida', |
|
| 582 | + 'pass_nouveau_enregistre' => 'A sua nova palavra-passe foi registada', |
|
| 583 | + 'pass_nouveau_pass' => 'Nova palavra-passe', |
|
| 584 | + 'pass_ok' => 'OK', |
|
| 585 | + 'pass_oubli_mot' => 'Palavra-passe esquecida', |
|
| 586 | + 'pass_procedure_changer' => 'Para alterar a sua palavra-passe, temos primeiro de verificar a sua identidade. Por favor escreva o endereço e-mail associado a esta conta.', # MODIF |
|
| 587 | + 'pass_quitter_fenetre' => 'Fechar esta janela', |
|
| 588 | + 'pass_rappel_login' => 'Recorde : o seu identificador (login) é « @login@ ».', |
|
| 589 | + 'pass_recevoir_mail' => 'Vai receber um email que indica como recuperar o seu acesso ao sítio.', # MODIF |
|
| 590 | + 'pass_retour_public' => 'Regresso ao sítio público', |
|
| 591 | + 'pass_rien_a_faire_ici' => 'Nada a fazer aqui.', |
|
| 592 | + 'pass_vousinscrire' => 'Inscrever-se neste sítio', |
|
| 593 | + 'precedent' => 'anterior', |
|
| 594 | + 'previsualisation' => 'Visualização', |
|
| 595 | + 'previsualiser' => 'Pré-visualizar', |
|
| 596 | 596 | |
| 597 | - // R |
|
| 598 | - 'retour' => 'Retroceder', |
|
| 597 | + // R |
|
| 598 | + 'retour' => 'Retroceder', |
|
| 599 | 599 | |
| 600 | - // S |
|
| 601 | - 'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :', |
|
| 602 | - 'squelette' => 'modelo', |
|
| 603 | - 'squelette_inclus_ligne' => 'modelo incluído, linha', |
|
| 604 | - 'squelette_ligne' => 'modelo, linha', |
|
| 605 | - 'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@', |
|
| 606 | - 'suivant' => 'seguinte', |
|
| 600 | + // S |
|
| 601 | + 'spip_conforme_dtd' => 'SPIP considera esta página em conforme com o seu DOCTYPE :', |
|
| 602 | + 'squelette' => 'modelo', |
|
| 603 | + 'squelette_inclus_ligne' => 'modelo incluído, linha', |
|
| 604 | + 'squelette_ligne' => 'modelo, linha', |
|
| 605 | + 'stats_visites_et_popularite' => '@visites@ visitas ; popularidade : @popularite@', |
|
| 606 | + 'suivant' => 'seguinte', |
|
| 607 | 607 | |
| 608 | - // T |
|
| 609 | - 'taille_go' => '@taille@ Gb', |
|
| 610 | - 'taille_ko' => '@taille@ kb', |
|
| 611 | - 'taille_mo' => '@taille@ Mb', |
|
| 612 | - 'taille_octets' => ' @taille@ bytes', |
|
| 613 | - 'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «', |
|
| 614 | - 'texte_actualite_site_2' => 'interface completa', |
|
| 615 | - 'texte_actualite_site_3' => '» para abrir mais possibilidades.', |
|
| 616 | - 'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.', |
|
| 617 | - 'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo, |
|
| 608 | + // T |
|
| 609 | + 'taille_go' => '@taille@ Gb', |
|
| 610 | + 'taille_ko' => '@taille@ kb', |
|
| 611 | + 'taille_mo' => '@taille@ Mb', |
|
| 612 | + 'taille_octets' => ' @taille@ bytes', |
|
| 613 | + 'texte_actualite_site_1' => 'Quando estiver familiarizado(a) com a interface, poderá clicar em «', |
|
| 614 | + 'texte_actualite_site_2' => 'interface completa', |
|
| 615 | + 'texte_actualite_site_3' => '» para abrir mais possibilidades.', |
|
| 616 | + 'texte_creation_automatique_vignette' => 'A criação automática de miniaturas de pré-visualização está activada neste sítio. Se instalar a partir deste formulário imagens de formato(s) @gd_formats@, serão acompanhadas de uma miniatura de um tamanho máximo de @taille_preview@ pixels.', |
|
| 617 | + 'texte_documents_associes' => 'Os documentos seguintes estão associados ao artigo, |
|
| 618 | 618 | mas não foram directamente |
| 619 | 619 | inseridos nele. Conforme a paginação do sítio público, |
| 620 | 620 | poderão aparecer sob forma de documentos anexados.', |
| 621 | - 'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento. |
|
| 621 | + 'texte_erreur_mise_niveau_base' => 'Erro de base de dados por ocasião do nivelamento. |
|
| 622 | 622 | A imagem <b>@fichier@</b> não passou (artigo @id_article@). |
| 623 | 623 | Note bem esta referência, volte a tentar o nivelamento, e verifique se as imagens aparecem sempre nos artigos.', |
| 624 | - 'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.', |
|
| 625 | - 'texte_inc_auth_1' => 'Você está identificado sob o |
|
| 624 | + 'texte_erreur_visiteur' => 'Tentou aceder à área privada usando um login não autorizado.', |
|
| 625 | + 'texte_inc_auth_1' => 'Você está identificado sob o |
|
| 626 | 626 | login <b>@auth_login@</b>, mas este já/ não existe na base de dados. |
| 627 | 627 | Tente', |
| 628 | - 'texte_inc_auth_2' => 'refazer a ligação', |
|
| 629 | - 'texte_inc_auth_3' => ', depois de eventualmente ter fechado e |
|
| 628 | + 'texte_inc_auth_2' => 'refazer a ligação', |
|
| 629 | + 'texte_inc_auth_3' => ', depois de eventualmente ter fechado e |
|
| 630 | 630 | voltado a abrir o seu navegador.', |
| 631 | - 'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o |
|
| 631 | + 'texte_inc_config' => 'As modificações efectuadas nestas páginas influenciam muito o |
|
| 632 | 632 | funcionamento do seu sítio. Recomendamos que não intervenha enquanto não estiver familiarizado com o funcionamento do sistema SPIP. <br /><br /><b> Em |
| 633 | 633 | geral, é fortemente recomendado |
| 634 | 634 | deixar a responsabilidade dessas páginas ao webmaster principal do seu sítio. <b>', |
| 635 | - 'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,', |
|
| 636 | - 'texte_inc_meta_2' => 'verificar as permissões de escrita', |
|
| 637 | - 'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.', |
|
| 638 | - 'texte_statut_en_cours_redaction' => 'em curso de redacção', |
|
| 639 | - 'texte_statut_poubelle' => 'para o caixote de lixo', |
|
| 640 | - 'texte_statut_propose_evaluation' => 'proposto para avaliação', |
|
| 641 | - 'texte_statut_publie' => 'publicado online', |
|
| 642 | - 'texte_statut_refuse' => 'recusado', |
|
| 643 | - 'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE', |
|
| 644 | - 'titre_cadre_raccourcis' => 'ATALHOS :', |
|
| 645 | - 'titre_changer_couleur_interface' => 'Mudar a cor da interface', |
|
| 646 | - 'titre_image_admin_article' => 'Pode administrar este artigo', |
|
| 647 | - 'titre_image_administrateur' => 'Administrador', |
|
| 648 | - 'titre_image_aide' => 'Ajuda sobre este elemento', |
|
| 649 | - 'titre_image_auteur_supprime' => 'Autor eliminado', |
|
| 650 | - 'titre_image_redacteur' => 'Redactor sem acesso', |
|
| 651 | - 'titre_image_redacteur_02' => 'Redactor', |
|
| 652 | - 'titre_image_selecteur' => 'Exibir a lista', |
|
| 653 | - 'titre_image_visiteur' => 'Visitante', |
|
| 654 | - 'titre_joindre_document' => 'ANEXAR UM DOCUMENTO', |
|
| 655 | - 'titre_mots_cles' => 'PALAVRAS-CHAVE', |
|
| 656 | - 'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.', |
|
| 657 | - 'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA', |
|
| 658 | - 'titre_signatures_attente' => 'Assinaturas aguardando validação', |
|
| 659 | - 'titre_signatures_confirmees' => 'Assinaturas confirmadas', |
|
| 660 | - 'titre_statistiques' => 'Estatísticas do sítio', |
|
| 661 | - 'titre_titre_document' => 'Título do documento :', |
|
| 662 | - 'todo' => 'a caminho', |
|
| 663 | - 'trad_reference' => '(referência para as traduções)', |
|
| 635 | + 'texte_inc_meta_1' => 'O sistema encontrou um erro durante a escrita do arquivo <code>@fichier@</code>. Como administrador do sítio, por favor,', |
|
| 636 | + 'texte_inc_meta_2' => 'verificar as permissões de escrita', |
|
| 637 | + 'texte_inc_meta_3' => 'no directório <code>@repertoire@</code>.', |
|
| 638 | + 'texte_statut_en_cours_redaction' => 'em curso de redacção', |
|
| 639 | + 'texte_statut_poubelle' => 'para o caixote de lixo', |
|
| 640 | + 'texte_statut_propose_evaluation' => 'proposto para avaliação', |
|
| 641 | + 'texte_statut_publie' => 'publicado online', |
|
| 642 | + 'texte_statut_refuse' => 'recusado', |
|
| 643 | + 'titre_ajouter_mot_cle' => 'ACRESCENTAR UMA PALAVRA-CHAVE', |
|
| 644 | + 'titre_cadre_raccourcis' => 'ATALHOS :', |
|
| 645 | + 'titre_changer_couleur_interface' => 'Mudar a cor da interface', |
|
| 646 | + 'titre_image_admin_article' => 'Pode administrar este artigo', |
|
| 647 | + 'titre_image_administrateur' => 'Administrador', |
|
| 648 | + 'titre_image_aide' => 'Ajuda sobre este elemento', |
|
| 649 | + 'titre_image_auteur_supprime' => 'Autor eliminado', |
|
| 650 | + 'titre_image_redacteur' => 'Redactor sem acesso', |
|
| 651 | + 'titre_image_redacteur_02' => 'Redactor', |
|
| 652 | + 'titre_image_selecteur' => 'Exibir a lista', |
|
| 653 | + 'titre_image_visiteur' => 'Visitante', |
|
| 654 | + 'titre_joindre_document' => 'ANEXAR UM DOCUMENTO', |
|
| 655 | + 'titre_mots_cles' => 'PALAVRAS-CHAVE', |
|
| 656 | + 'titre_probleme_technique' => 'Atenção : um problema técnico (servidor SQL) impede o acesso a esta parte do sítio. Obrigado pela sua compreensão.', |
|
| 657 | + 'titre_publier_document' => 'PUBLICAR UM DOCUMENTO NESTA RUBRICA', |
|
| 658 | + 'titre_signatures_attente' => 'Assinaturas aguardando validação', |
|
| 659 | + 'titre_signatures_confirmees' => 'Assinaturas confirmadas', |
|
| 660 | + 'titre_statistiques' => 'Estatísticas do sítio', |
|
| 661 | + 'titre_titre_document' => 'Título do documento :', |
|
| 662 | + 'todo' => 'a caminho', |
|
| 663 | + 'trad_reference' => '(referência para as traduções)', |
|
| 664 | 664 | |
| 665 | - // Z |
|
| 666 | - 'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito', |
|
| 667 | - 'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@', |
|
| 668 | - 'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@', |
|
| 669 | - 'zbug_boucle' => 'laço infinito', |
|
| 670 | - 'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@', |
|
| 671 | - 'zbug_calcul' => 'cálculo', |
|
| 672 | - 'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito', |
|
| 673 | - 'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@', |
|
| 674 | - 'zbug_code' => 'código', |
|
| 675 | - 'zbug_critere_inconnu' => 'critério desconhecido @critere@ ', |
|
| 676 | - 'zbug_distant_interdit' => 'Dados externos interditos', |
|
| 677 | - 'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples', |
|
| 678 | - 'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice', |
|
| 679 | - 'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ', |
|
| 680 | - 'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta ', |
|
| 681 | - 'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@', |
|
| 682 | - 'zbug_erreur_compilation' => 'Erro de compilação', |
|
| 683 | - 'zbug_erreur_execution_page' => 'erro de execução da página', |
|
| 684 | - 'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ', |
|
| 685 | - 'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)', |
|
| 686 | - 'zbug_erreur_squelette' => 'Erro(s) no modelo', |
|
| 687 | - 'zbug_hors_compilation' => 'Não compilado', |
|
| 688 | - 'zbug_info_erreur_squelette' => 'Erro no sítio', |
|
| 689 | - 'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente', |
|
| 690 | - 'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo', |
|
| 691 | - 'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@', |
|
| 692 | - 'zbug_profile' => 'Cálculo de tempo : @time@', |
|
| 693 | - 'zbug_resultat' => 'resultado', |
|
| 694 | - 'zbug_serveur_indefini' => 'Sevidor SQL não definido', |
|
| 695 | - 'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração', |
|
| 696 | - 'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida', |
|
| 697 | - 'zxml_connus_attributs' => 'attributos conhecidos', |
|
| 698 | - 'zxml_de' => 'de', |
|
| 699 | - 'zxml_inconnu_attribut' => 'atributo desconhecido', |
|
| 700 | - 'zxml_inconnu_balise' => 'tag desconhecida', |
|
| 701 | - 'zxml_inconnu_entite' => 'entidade desconhecida', |
|
| 702 | - 'zxml_inconnu_id' => 'ID desconhecido', |
|
| 703 | - 'zxml_mais_de' => 'mas de', |
|
| 704 | - 'zxml_non_conforme' => 'não está de acordo com o princípio', |
|
| 705 | - 'zxml_non_fils' => 'não é um filho de ', |
|
| 706 | - 'zxml_nonvide_balise' => 'a tag não está vazia', |
|
| 707 | - 'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta', |
|
| 708 | - 'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta', |
|
| 709 | - 'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima', |
|
| 710 | - 'zxml_valeur_attribut' => 'valor do atributo', |
|
| 711 | - 'zxml_vide_balise' => 'tag vazia', |
|
| 712 | - 'zxml_vu' => 'visualizado antes' |
|
| 665 | + // Z |
|
| 666 | + 'zbug_balise_b_aval' => ': tag B colocada demasiado tarde no laço infinito', |
|
| 667 | + 'zbug_balise_inexistante' => 'Tag @balise@ mal declarada para @from@', |
|
| 668 | + 'zbug_balise_sans_argument' => 'Argumento em falta na tag @balise@', |
|
| 669 | + 'zbug_boucle' => 'laço infinito', |
|
| 670 | + 'zbug_boucle_recursive_undef' => 'laço recursivo não definido @nom@', |
|
| 671 | + 'zbug_calcul' => 'cálculo', |
|
| 672 | + 'zbug_champ_hors_boucle' => 'Campo @champ@ fora do laço infinito', |
|
| 673 | + 'zbug_champ_hors_motif' => 'Campo @champ@ fora de contexto @motif@', |
|
| 674 | + 'zbug_code' => 'código', |
|
| 675 | + 'zbug_critere_inconnu' => 'critério desconhecido @critere@ ', |
|
| 676 | + 'zbug_distant_interdit' => 'Dados externos interditos', |
|
| 677 | + 'zbug_doublon_table_sans_cle_primaire' => 'Entradas duplas numa tabela que não tem uma chave primária simples', |
|
| 678 | + 'zbug_doublon_table_sans_index' => 'Entradas duplas numa tabela sem índice', |
|
| 679 | + 'zbug_erreur_boucle_double' => 'laço @id@: Dupla definição ', |
|
| 680 | + 'zbug_erreur_boucle_fermant' => 'laço @id@: tag final em falta ', |
|
| 681 | + 'zbug_erreur_boucle_syntaxe' => 'Laço com sintaxe incorrecta @id@', |
|
| 682 | + 'zbug_erreur_compilation' => 'Erro de compilação', |
|
| 683 | + 'zbug_erreur_execution_page' => 'erro de execução da página', |
|
| 684 | + 'zbug_erreur_filtre' => 'Erro : filtro indefinido @filtre@ ', |
|
| 685 | + 'zbug_erreur_meme_parent' => '{meme_parent} aplica-se exclusivamente aos laços (FORUMS) ou (RUBRIQUES)', |
|
| 686 | + 'zbug_erreur_squelette' => 'Erro(s) no modelo', |
|
| 687 | + 'zbug_hors_compilation' => 'Não compilado', |
|
| 688 | + 'zbug_info_erreur_squelette' => 'Erro no sítio', |
|
| 689 | + 'zbug_inversion_ordre_inexistant' => 'inversão de uma ordem inexistente', |
|
| 690 | + 'zbug_pagination_sans_critere' => '#PAGINAÇÃO sem critério {paginação} ou usada num laço recursivo', |
|
| 691 | + 'zbug_parametres_inclus_incorrects' => 'Parâmetros de inclusão incorrectos: @param@', |
|
| 692 | + 'zbug_profile' => 'Cálculo de tempo : @time@', |
|
| 693 | + 'zbug_resultat' => 'resultado', |
|
| 694 | + 'zbug_serveur_indefini' => 'Sevidor SQL não definido', |
|
| 695 | + 'zbug_statistiques' => 'Estatísticas das consulta SQL classificadas por duração', |
|
| 696 | + 'zbug_table_inconnue' => 'Tabela SQL «@table@» desconhecida', |
|
| 697 | + 'zxml_connus_attributs' => 'attributos conhecidos', |
|
| 698 | + 'zxml_de' => 'de', |
|
| 699 | + 'zxml_inconnu_attribut' => 'atributo desconhecido', |
|
| 700 | + 'zxml_inconnu_balise' => 'tag desconhecida', |
|
| 701 | + 'zxml_inconnu_entite' => 'entidade desconhecida', |
|
| 702 | + 'zxml_inconnu_id' => 'ID desconhecido', |
|
| 703 | + 'zxml_mais_de' => 'mas de', |
|
| 704 | + 'zxml_non_conforme' => 'não está de acordo com o princípio', |
|
| 705 | + 'zxml_non_fils' => 'não é um filho de ', |
|
| 706 | + 'zxml_nonvide_balise' => 'a tag não está vazia', |
|
| 707 | + 'zxml_obligatoire_attribut' => 'atributo obrigatório está em falta', |
|
| 708 | + 'zxml_succession_fils_incorrecte' => 'sucessão de filhos incorrecta', |
|
| 709 | + 'zxml_survoler' => 'para visualizar os correctos, mover o rato por cima', |
|
| 710 | + 'zxml_valeur_attribut' => 'valor do atributo', |
|
| 711 | + 'zxml_vide_balise' => 'tag vazia', |
|
| 712 | + 'zxml_vu' => 'visualizado antes' |
|
| 713 | 713 | ); |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -39,28 +39,28 @@ discard block |
||
| 39 | 39 | * Tableau des champs et valeurs collectées |
| 40 | 40 | */ |
| 41 | 41 | function collecter_requests($white_list, $black_list = [], $set = null, $tous = false) { |
| 42 | - $c = $set; |
|
| 43 | - if (!$c) { |
|
| 44 | - $c = []; |
|
| 45 | - foreach ($white_list as $champ) { |
|
| 46 | - // on ne collecte que les champs reellement envoyes par defaut. |
|
| 47 | - // le cas d'un envoi de valeur NULL peut du coup poser probleme. |
|
| 48 | - $val = _request($champ); |
|
| 49 | - if ($tous or $val !== null) { |
|
| 50 | - $c[$champ] = $val; |
|
| 51 | - } |
|
| 52 | - } |
|
| 53 | - // on ajoute toujours la lang en saisie possible |
|
| 54 | - // meme si pas prevu au depart pour l'objet concerne |
|
| 55 | - if ($l = _request('changer_lang')) { |
|
| 56 | - $c['lang'] = $l; |
|
| 57 | - } |
|
| 58 | - } |
|
| 59 | - foreach ($black_list as $champ) { |
|
| 60 | - unset($c[$champ]); |
|
| 61 | - } |
|
| 62 | - |
|
| 63 | - return $c; |
|
| 42 | + $c = $set; |
|
| 43 | + if (!$c) { |
|
| 44 | + $c = []; |
|
| 45 | + foreach ($white_list as $champ) { |
|
| 46 | + // on ne collecte que les champs reellement envoyes par defaut. |
|
| 47 | + // le cas d'un envoi de valeur NULL peut du coup poser probleme. |
|
| 48 | + $val = _request($champ); |
|
| 49 | + if ($tous or $val !== null) { |
|
| 50 | + $c[$champ] = $val; |
|
| 51 | + } |
|
| 52 | + } |
|
| 53 | + // on ajoute toujours la lang en saisie possible |
|
| 54 | + // meme si pas prevu au depart pour l'objet concerne |
|
| 55 | + if ($l = _request('changer_lang')) { |
|
| 56 | + $c['lang'] = $l; |
|
| 57 | + } |
|
| 58 | + } |
|
| 59 | + foreach ($black_list as $champ) { |
|
| 60 | + unset($c[$champ]); |
|
| 61 | + } |
|
| 62 | + |
|
| 63 | + return $c; |
|
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | /** |
@@ -97,237 +97,237 @@ discard block |
||
| 97 | 97 | * - chaîne : Texte d'un message d'erreur |
| 98 | 98 | */ |
| 99 | 99 | function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') { |
| 100 | - if (!$id_objet = intval($id_objet)) { |
|
| 101 | - spip_log('Erreur $id_objet non defini', 'warn'); |
|
| 102 | - |
|
| 103 | - return _T('erreur_technique_enregistrement_impossible'); |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - include_spip('inc/filtres'); |
|
| 107 | - |
|
| 108 | - $table_objet = table_objet($objet, $serveur); |
|
| 109 | - $spip_table_objet = table_objet_sql($objet, $serveur); |
|
| 110 | - $id_table_objet = id_table_objet($objet, $serveur); |
|
| 111 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 112 | - $desc = $trouver_table($spip_table_objet, $serveur); |
|
| 113 | - |
|
| 114 | - // Appels incomplets (sans $c) |
|
| 115 | - if (!is_array($c)) { |
|
| 116 | - spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 117 | - |
|
| 118 | - return _T('erreur_technique_enregistrement_impossible'); |
|
| 119 | - } |
|
| 120 | - |
|
| 121 | - // Securite : certaines variables ne sont jamais acceptees ici |
|
| 122 | - // car elles ne relevent pas de autoriser(xxx, modifier) ; |
|
| 123 | - // il faut passer par instituer_XX() |
|
| 124 | - // TODO: faut-il passer ces variables interdites |
|
| 125 | - // dans un fichier de description separe ? |
|
| 126 | - unset($c['statut']); |
|
| 127 | - unset($c['id_parent']); |
|
| 128 | - unset($c['id_rubrique']); |
|
| 129 | - unset($c['id_secteur']); |
|
| 130 | - |
|
| 131 | - // Gerer les champs non vides |
|
| 132 | - if (isset($options['nonvide']) and is_array($options['nonvide'])) { |
|
| 133 | - foreach ($options['nonvide'] as $champ => $sinon) { |
|
| 134 | - if (isset($c[$champ]) and $c[$champ] === '') { |
|
| 135 | - $c[$champ] = $sinon; |
|
| 136 | - } |
|
| 137 | - } |
|
| 138 | - } |
|
| 139 | - |
|
| 140 | - // N'accepter que les champs qui existent |
|
| 141 | - // TODO: ici aussi on peut valider les contenus |
|
| 142 | - // en fonction du type |
|
| 143 | - $champs = array_intersect_key($c, $desc['field']); |
|
| 144 | - |
|
| 145 | - // Nettoyer les valeurs |
|
| 146 | - $champs = array_map('corriger_caracteres', $champs); |
|
| 147 | - |
|
| 148 | - // On récupère l'état avant toute modification |
|
| 149 | - $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 150 | - |
|
| 151 | - // Envoyer aux plugins |
|
| 152 | - $champs = pipeline( |
|
| 153 | - 'pre_edition', |
|
| 154 | - [ |
|
| 155 | - 'args' => [ |
|
| 156 | - 'table' => $spip_table_objet, // compatibilite |
|
| 157 | - 'table_objet' => $table_objet, |
|
| 158 | - 'spip_table_objet' => $spip_table_objet, |
|
| 159 | - 'desc' => $desc, |
|
| 160 | - 'type' => $objet, |
|
| 161 | - 'id_objet' => $id_objet, |
|
| 162 | - 'data' => $options['data'] ?? null, |
|
| 163 | - 'champs' => $options['champs'] ?? [], // [doc] c'est quoi ? |
|
| 164 | - 'champs_anciens' => $row, // état du contenu avant modif |
|
| 165 | - 'serveur' => $serveur, |
|
| 166 | - 'action' => $options['action'] ?? 'modifier' |
|
| 167 | - ], |
|
| 168 | - 'data' => $champs |
|
| 169 | - ] |
|
| 170 | - ); |
|
| 171 | - |
|
| 172 | - if (!$champs) { |
|
| 173 | - return false; |
|
| 174 | - } |
|
| 175 | - |
|
| 176 | - |
|
| 177 | - // marquer le fait que l'objet est travaille par toto a telle date |
|
| 178 | - if ($GLOBALS['meta']['articles_modif'] != 'non') { |
|
| 179 | - include_spip('inc/drapeau_edition'); |
|
| 180 | - signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet); |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - // Verifier si les mises a jour sont pertinentes, datees, en conflit etc |
|
| 184 | - include_spip('inc/editer'); |
|
| 185 | - if (!isset($options['data']) or is_null($options['data'])) { |
|
| 186 | - $options['data'] = &$_POST; |
|
| 187 | - } |
|
| 188 | - $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur); |
|
| 189 | - // cas hypothetique : normalement inc/editer verifie en amont le conflit edition |
|
| 190 | - // et gere l'interface |
|
| 191 | - // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme |
|
| 192 | - if ($conflits) { |
|
| 193 | - return _T('titre_conflit_edition'); |
|
| 194 | - } |
|
| 195 | - |
|
| 196 | - if ($champs) { |
|
| 197 | - // cas particulier de la langue : passer par instituer_langue_objet |
|
| 198 | - if (isset($champs['lang'])) { |
|
| 199 | - if ($changer_lang = $champs['lang']) { |
|
| 200 | - $id_rubrique = 0; |
|
| 201 | - if (isset($desc['field']['id_rubrique'])) { |
|
| 202 | - $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
|
| 203 | - $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 204 | - } |
|
| 205 | - $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
|
| 206 | - $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
|
| 207 | - } |
|
| 208 | - // on laisse 'lang' dans $champs, |
|
| 209 | - // ca permet de passer dans le pipeline post_edition et de journaliser |
|
| 210 | - // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir |
|
| 211 | - // deja pris en compte |
|
| 212 | - } |
|
| 213 | - |
|
| 214 | - // la modif peut avoir lieu |
|
| 215 | - |
|
| 216 | - // faut-il ajouter date_modif ? |
|
| 217 | - if ( |
|
| 218 | - !empty($options['date_modif']) |
|
| 219 | - and !isset($champs[$options['date_modif']]) |
|
| 220 | - ) { |
|
| 221 | - $champs[$options['date_modif']] = date('Y-m-d H:i:s'); |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - // allez on commit la modif |
|
| 225 | - sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur); |
|
| 226 | - |
|
| 227 | - // on verifie si elle est bien passee |
|
| 228 | - $moof = sql_fetsel( |
|
| 229 | - array_keys($champs), |
|
| 230 | - $spip_table_objet, |
|
| 231 | - "$id_table_objet=" . intval($id_objet), |
|
| 232 | - [], |
|
| 233 | - [], |
|
| 234 | - '', |
|
| 235 | - [], |
|
| 236 | - $serveur |
|
| 237 | - ); |
|
| 238 | - // si difference entre les champs, reperer les champs mal enregistres |
|
| 239 | - if ($moof != $champs) { |
|
| 240 | - $liste = []; |
|
| 241 | - foreach ($moof as $k => $v) { |
|
| 242 | - if ( |
|
| 243 | - $v !== $champs[$k] |
|
| 244 | - // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes |
|
| 245 | - and (!is_numeric($v) or intval($v) !== intval($champs[$k])) |
|
| 246 | - // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle |
|
| 247 | - and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00'])) |
|
| 248 | - ) { |
|
| 249 | - $liste[] = $k; |
|
| 250 | - $conflits[$k]['post'] = $champs[$k]; |
|
| 251 | - $conflits[$k]['save'] = $v; |
|
| 252 | - |
|
| 253 | - // cas specifique MySQL+emoji : si l'un est la |
|
| 254 | - // conversion utf8_noplanes de l'autre alors c'est OK |
|
| 255 | - if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) { |
|
| 256 | - include_spip('inc/charsets'); |
|
| 257 | - if ($v == utf8_noplanes($champs[$k])) { |
|
| 258 | - array_pop($liste); |
|
| 259 | - } |
|
| 260 | - } |
|
| 261 | - } |
|
| 262 | - } |
|
| 263 | - // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur |
|
| 264 | - // c'est un cas exceptionnel |
|
| 265 | - if (count($liste)) { |
|
| 266 | - spip_log( |
|
| 267 | - "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 268 | - 'modifier.' . _LOG_CRITIQUE |
|
| 269 | - ); |
|
| 270 | - |
|
| 271 | - return _T( |
|
| 272 | - 'erreur_technique_enregistrement_champs', |
|
| 273 | - ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 274 | - ); |
|
| 275 | - } |
|
| 276 | - } |
|
| 277 | - |
|
| 278 | - // Invalider les caches |
|
| 279 | - if (isset($options['invalideur']) and $options['invalideur']) { |
|
| 280 | - include_spip('inc/invalideur'); |
|
| 281 | - if (is_array($options['invalideur'])) { |
|
| 282 | - array_map('suivre_invalideur', $options['invalideur']); |
|
| 283 | - } else { |
|
| 284 | - suivre_invalideur($options['invalideur']); |
|
| 285 | - } |
|
| 286 | - } |
|
| 287 | - |
|
| 288 | - // Notifications, gestion des revisions... |
|
| 289 | - // en standard, appelle |nouvelle_revision ci-dessous |
|
| 290 | - pipeline( |
|
| 291 | - 'post_edition', |
|
| 292 | - [ |
|
| 293 | - 'args' => [ |
|
| 294 | - 'table' => $spip_table_objet, |
|
| 295 | - 'table_objet' => $table_objet, |
|
| 296 | - 'spip_table_objet' => $spip_table_objet, |
|
| 297 | - 'desc' => $desc, |
|
| 298 | - 'type' => $objet, |
|
| 299 | - 'id_objet' => $id_objet, |
|
| 300 | - 'champs' => $options['champs'] ?? [], // [doc] kesako ? |
|
| 301 | - 'champs_anciens' => $row, // état du contenu avant modif |
|
| 302 | - 'serveur' => $serveur, |
|
| 303 | - 'action' => $options['action'] ?? 'modifier' |
|
| 304 | - ], |
|
| 305 | - 'data' => $champs |
|
| 306 | - ] |
|
| 307 | - ); |
|
| 308 | - } |
|
| 309 | - |
|
| 310 | - // journaliser l'affaire |
|
| 311 | - // message a affiner :-) |
|
| 312 | - include_spip('inc/filtres_mini'); |
|
| 313 | - $qui = ''; |
|
| 314 | - if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 315 | - $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 316 | - } |
|
| 317 | - if (!empty($GLOBALS['visiteur_session']['nom'])) { |
|
| 318 | - $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 319 | - } |
|
| 320 | - if ($qui == '') { |
|
| 321 | - $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 322 | - } |
|
| 323 | - journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 324 | - '+', |
|
| 325 | - array_diff(array_keys($champs), ['date_modif']) |
|
| 326 | - ) . ')'), [ |
|
| 327 | - 'faire' => 'modifier', |
|
| 328 | - 'quoi' => $objet, |
|
| 329 | - 'id' => $id_objet |
|
| 330 | - ]); |
|
| 331 | - |
|
| 332 | - return ''; |
|
| 100 | + if (!$id_objet = intval($id_objet)) { |
|
| 101 | + spip_log('Erreur $id_objet non defini', 'warn'); |
|
| 102 | + |
|
| 103 | + return _T('erreur_technique_enregistrement_impossible'); |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + include_spip('inc/filtres'); |
|
| 107 | + |
|
| 108 | + $table_objet = table_objet($objet, $serveur); |
|
| 109 | + $spip_table_objet = table_objet_sql($objet, $serveur); |
|
| 110 | + $id_table_objet = id_table_objet($objet, $serveur); |
|
| 111 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 112 | + $desc = $trouver_table($spip_table_objet, $serveur); |
|
| 113 | + |
|
| 114 | + // Appels incomplets (sans $c) |
|
| 115 | + if (!is_array($c)) { |
|
| 116 | + spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 117 | + |
|
| 118 | + return _T('erreur_technique_enregistrement_impossible'); |
|
| 119 | + } |
|
| 120 | + |
|
| 121 | + // Securite : certaines variables ne sont jamais acceptees ici |
|
| 122 | + // car elles ne relevent pas de autoriser(xxx, modifier) ; |
|
| 123 | + // il faut passer par instituer_XX() |
|
| 124 | + // TODO: faut-il passer ces variables interdites |
|
| 125 | + // dans un fichier de description separe ? |
|
| 126 | + unset($c['statut']); |
|
| 127 | + unset($c['id_parent']); |
|
| 128 | + unset($c['id_rubrique']); |
|
| 129 | + unset($c['id_secteur']); |
|
| 130 | + |
|
| 131 | + // Gerer les champs non vides |
|
| 132 | + if (isset($options['nonvide']) and is_array($options['nonvide'])) { |
|
| 133 | + foreach ($options['nonvide'] as $champ => $sinon) { |
|
| 134 | + if (isset($c[$champ]) and $c[$champ] === '') { |
|
| 135 | + $c[$champ] = $sinon; |
|
| 136 | + } |
|
| 137 | + } |
|
| 138 | + } |
|
| 139 | + |
|
| 140 | + // N'accepter que les champs qui existent |
|
| 141 | + // TODO: ici aussi on peut valider les contenus |
|
| 142 | + // en fonction du type |
|
| 143 | + $champs = array_intersect_key($c, $desc['field']); |
|
| 144 | + |
|
| 145 | + // Nettoyer les valeurs |
|
| 146 | + $champs = array_map('corriger_caracteres', $champs); |
|
| 147 | + |
|
| 148 | + // On récupère l'état avant toute modification |
|
| 149 | + $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 150 | + |
|
| 151 | + // Envoyer aux plugins |
|
| 152 | + $champs = pipeline( |
|
| 153 | + 'pre_edition', |
|
| 154 | + [ |
|
| 155 | + 'args' => [ |
|
| 156 | + 'table' => $spip_table_objet, // compatibilite |
|
| 157 | + 'table_objet' => $table_objet, |
|
| 158 | + 'spip_table_objet' => $spip_table_objet, |
|
| 159 | + 'desc' => $desc, |
|
| 160 | + 'type' => $objet, |
|
| 161 | + 'id_objet' => $id_objet, |
|
| 162 | + 'data' => $options['data'] ?? null, |
|
| 163 | + 'champs' => $options['champs'] ?? [], // [doc] c'est quoi ? |
|
| 164 | + 'champs_anciens' => $row, // état du contenu avant modif |
|
| 165 | + 'serveur' => $serveur, |
|
| 166 | + 'action' => $options['action'] ?? 'modifier' |
|
| 167 | + ], |
|
| 168 | + 'data' => $champs |
|
| 169 | + ] |
|
| 170 | + ); |
|
| 171 | + |
|
| 172 | + if (!$champs) { |
|
| 173 | + return false; |
|
| 174 | + } |
|
| 175 | + |
|
| 176 | + |
|
| 177 | + // marquer le fait que l'objet est travaille par toto a telle date |
|
| 178 | + if ($GLOBALS['meta']['articles_modif'] != 'non') { |
|
| 179 | + include_spip('inc/drapeau_edition'); |
|
| 180 | + signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet); |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + // Verifier si les mises a jour sont pertinentes, datees, en conflit etc |
|
| 184 | + include_spip('inc/editer'); |
|
| 185 | + if (!isset($options['data']) or is_null($options['data'])) { |
|
| 186 | + $options['data'] = &$_POST; |
|
| 187 | + } |
|
| 188 | + $conflits = controler_md5($champs, $options['data'], $objet, $id_objet, $serveur); |
|
| 189 | + // cas hypothetique : normalement inc/editer verifie en amont le conflit edition |
|
| 190 | + // et gere l'interface |
|
| 191 | + // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme |
|
| 192 | + if ($conflits) { |
|
| 193 | + return _T('titre_conflit_edition'); |
|
| 194 | + } |
|
| 195 | + |
|
| 196 | + if ($champs) { |
|
| 197 | + // cas particulier de la langue : passer par instituer_langue_objet |
|
| 198 | + if (isset($champs['lang'])) { |
|
| 199 | + if ($changer_lang = $champs['lang']) { |
|
| 200 | + $id_rubrique = 0; |
|
| 201 | + if (isset($desc['field']['id_rubrique'])) { |
|
| 202 | + $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
|
| 203 | + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 204 | + } |
|
| 205 | + $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
|
| 206 | + $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
|
| 207 | + } |
|
| 208 | + // on laisse 'lang' dans $champs, |
|
| 209 | + // ca permet de passer dans le pipeline post_edition et de journaliser |
|
| 210 | + // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir |
|
| 211 | + // deja pris en compte |
|
| 212 | + } |
|
| 213 | + |
|
| 214 | + // la modif peut avoir lieu |
|
| 215 | + |
|
| 216 | + // faut-il ajouter date_modif ? |
|
| 217 | + if ( |
|
| 218 | + !empty($options['date_modif']) |
|
| 219 | + and !isset($champs[$options['date_modif']]) |
|
| 220 | + ) { |
|
| 221 | + $champs[$options['date_modif']] = date('Y-m-d H:i:s'); |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + // allez on commit la modif |
|
| 225 | + sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur); |
|
| 226 | + |
|
| 227 | + // on verifie si elle est bien passee |
|
| 228 | + $moof = sql_fetsel( |
|
| 229 | + array_keys($champs), |
|
| 230 | + $spip_table_objet, |
|
| 231 | + "$id_table_objet=" . intval($id_objet), |
|
| 232 | + [], |
|
| 233 | + [], |
|
| 234 | + '', |
|
| 235 | + [], |
|
| 236 | + $serveur |
|
| 237 | + ); |
|
| 238 | + // si difference entre les champs, reperer les champs mal enregistres |
|
| 239 | + if ($moof != $champs) { |
|
| 240 | + $liste = []; |
|
| 241 | + foreach ($moof as $k => $v) { |
|
| 242 | + if ( |
|
| 243 | + $v !== $champs[$k] |
|
| 244 | + // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes |
|
| 245 | + and (!is_numeric($v) or intval($v) !== intval($champs[$k])) |
|
| 246 | + // ne pas alerter si le champ est date, qu'on a envoye une valeur vide et qu'on recupere une date nulle |
|
| 247 | + and (strlen($champs[$k]) or !in_array($v, ['0000-00-00 00:00:00', '0000-00-00'])) |
|
| 248 | + ) { |
|
| 249 | + $liste[] = $k; |
|
| 250 | + $conflits[$k]['post'] = $champs[$k]; |
|
| 251 | + $conflits[$k]['save'] = $v; |
|
| 252 | + |
|
| 253 | + // cas specifique MySQL+emoji : si l'un est la |
|
| 254 | + // conversion utf8_noplanes de l'autre alors c'est OK |
|
| 255 | + if (defined('_MYSQL_NOPLANES') && _MYSQL_NOPLANES) { |
|
| 256 | + include_spip('inc/charsets'); |
|
| 257 | + if ($v == utf8_noplanes($champs[$k])) { |
|
| 258 | + array_pop($liste); |
|
| 259 | + } |
|
| 260 | + } |
|
| 261 | + } |
|
| 262 | + } |
|
| 263 | + // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur |
|
| 264 | + // c'est un cas exceptionnel |
|
| 265 | + if (count($liste)) { |
|
| 266 | + spip_log( |
|
| 267 | + "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 268 | + 'modifier.' . _LOG_CRITIQUE |
|
| 269 | + ); |
|
| 270 | + |
|
| 271 | + return _T( |
|
| 272 | + 'erreur_technique_enregistrement_champs', |
|
| 273 | + ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 274 | + ); |
|
| 275 | + } |
|
| 276 | + } |
|
| 277 | + |
|
| 278 | + // Invalider les caches |
|
| 279 | + if (isset($options['invalideur']) and $options['invalideur']) { |
|
| 280 | + include_spip('inc/invalideur'); |
|
| 281 | + if (is_array($options['invalideur'])) { |
|
| 282 | + array_map('suivre_invalideur', $options['invalideur']); |
|
| 283 | + } else { |
|
| 284 | + suivre_invalideur($options['invalideur']); |
|
| 285 | + } |
|
| 286 | + } |
|
| 287 | + |
|
| 288 | + // Notifications, gestion des revisions... |
|
| 289 | + // en standard, appelle |nouvelle_revision ci-dessous |
|
| 290 | + pipeline( |
|
| 291 | + 'post_edition', |
|
| 292 | + [ |
|
| 293 | + 'args' => [ |
|
| 294 | + 'table' => $spip_table_objet, |
|
| 295 | + 'table_objet' => $table_objet, |
|
| 296 | + 'spip_table_objet' => $spip_table_objet, |
|
| 297 | + 'desc' => $desc, |
|
| 298 | + 'type' => $objet, |
|
| 299 | + 'id_objet' => $id_objet, |
|
| 300 | + 'champs' => $options['champs'] ?? [], // [doc] kesako ? |
|
| 301 | + 'champs_anciens' => $row, // état du contenu avant modif |
|
| 302 | + 'serveur' => $serveur, |
|
| 303 | + 'action' => $options['action'] ?? 'modifier' |
|
| 304 | + ], |
|
| 305 | + 'data' => $champs |
|
| 306 | + ] |
|
| 307 | + ); |
|
| 308 | + } |
|
| 309 | + |
|
| 310 | + // journaliser l'affaire |
|
| 311 | + // message a affiner :-) |
|
| 312 | + include_spip('inc/filtres_mini'); |
|
| 313 | + $qui = ''; |
|
| 314 | + if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 315 | + $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 316 | + } |
|
| 317 | + if (!empty($GLOBALS['visiteur_session']['nom'])) { |
|
| 318 | + $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 319 | + } |
|
| 320 | + if ($qui == '') { |
|
| 321 | + $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 322 | + } |
|
| 323 | + journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 324 | + '+', |
|
| 325 | + array_diff(array_keys($champs), ['date_modif']) |
|
| 326 | + ) . ')'), [ |
|
| 327 | + 'faire' => 'modifier', |
|
| 328 | + 'quoi' => $objet, |
|
| 329 | + 'id' => $id_objet |
|
| 330 | + ]); |
|
| 331 | + |
|
| 332 | + return ''; |
|
| 333 | 333 | } |
@@ -113,7 +113,7 @@ discard block |
||
| 113 | 113 | |
| 114 | 114 | // Appels incomplets (sans $c) |
| 115 | 115 | if (!is_array($c)) { |
| 116 | - spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); |
|
| 116 | + spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c'); |
|
| 117 | 117 | |
| 118 | 118 | return _T('erreur_technique_enregistrement_impossible'); |
| 119 | 119 | } |
@@ -146,7 +146,7 @@ discard block |
||
| 146 | 146 | $champs = array_map('corriger_caracteres', $champs); |
| 147 | 147 | |
| 148 | 148 | // On récupère l'état avant toute modification |
| 149 | - $row = sql_fetsel('*', $spip_table_objet, $id_table_objet . '=' . $id_objet); |
|
| 149 | + $row = sql_fetsel('*', $spip_table_objet, $id_table_objet.'='.$id_objet); |
|
| 150 | 150 | |
| 151 | 151 | // Envoyer aux plugins |
| 152 | 152 | $champs = pipeline( |
@@ -200,7 +200,7 @@ discard block |
||
| 200 | 200 | $id_rubrique = 0; |
| 201 | 201 | if (isset($desc['field']['id_rubrique'])) { |
| 202 | 202 | $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; |
| 203 | - $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); |
|
| 203 | + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet)); |
|
| 204 | 204 | } |
| 205 | 205 | $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); |
| 206 | 206 | $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur); |
@@ -222,13 +222,13 @@ discard block |
||
| 222 | 222 | } |
| 223 | 223 | |
| 224 | 224 | // allez on commit la modif |
| 225 | - sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur); |
|
| 225 | + sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), $serveur); |
|
| 226 | 226 | |
| 227 | 227 | // on verifie si elle est bien passee |
| 228 | 228 | $moof = sql_fetsel( |
| 229 | 229 | array_keys($champs), |
| 230 | 230 | $spip_table_objet, |
| 231 | - "$id_table_objet=" . intval($id_objet), |
|
| 231 | + "$id_table_objet=".intval($id_objet), |
|
| 232 | 232 | [], |
| 233 | 233 | [], |
| 234 | 234 | '', |
@@ -264,13 +264,13 @@ discard block |
||
| 264 | 264 | // c'est un cas exceptionnel |
| 265 | 265 | if (count($liste)) { |
| 266 | 266 | spip_log( |
| 267 | - "Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), |
|
| 268 | - 'modifier.' . _LOG_CRITIQUE |
|
| 267 | + "Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits, true), |
|
| 268 | + 'modifier.'._LOG_CRITIQUE |
|
| 269 | 269 | ); |
| 270 | 270 | |
| 271 | 271 | return _T( |
| 272 | 272 | 'erreur_technique_enregistrement_champs', |
| 273 | - ['champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>"] |
|
| 273 | + ['champs' => "<i>'".implode("'</i>,<i>'", $liste)."'</i>"] |
|
| 274 | 274 | ); |
| 275 | 275 | } |
| 276 | 276 | } |
@@ -312,18 +312,18 @@ discard block |
||
| 312 | 312 | include_spip('inc/filtres_mini'); |
| 313 | 313 | $qui = ''; |
| 314 | 314 | if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
| 315 | - $qui .= ' #id_auteur:' . $GLOBALS['visiteur_session']['id_auteur'] . '#'; |
|
| 315 | + $qui .= ' #id_auteur:'.$GLOBALS['visiteur_session']['id_auteur'].'#'; |
|
| 316 | 316 | } |
| 317 | 317 | if (!empty($GLOBALS['visiteur_session']['nom'])) { |
| 318 | - $qui .= ' #nom:' . $GLOBALS['visiteur_session']['nom'] . '#'; |
|
| 318 | + $qui .= ' #nom:'.$GLOBALS['visiteur_session']['nom'].'#'; |
|
| 319 | 319 | } |
| 320 | 320 | if ($qui == '') { |
| 321 | - $qui = '#ip:' . $GLOBALS['ip'] . '#'; |
|
| 321 | + $qui = '#ip:'.$GLOBALS['ip'].'#'; |
|
| 322 | 322 | } |
| 323 | - journal(_L($qui . ' a édité ' . $objet . ' ' . $id_objet . ' (' . join( |
|
| 323 | + journal(_L($qui.' a édité '.$objet.' '.$id_objet.' ('.join( |
|
| 324 | 324 | '+', |
| 325 | 325 | array_diff(array_keys($champs), ['date_modif']) |
| 326 | - ) . ')'), [ |
|
| 326 | + ).')'), [ |
|
| 327 | 327 | 'faire' => 'modifier', |
| 328 | 328 | 'quoi' => $objet, |
| 329 | 329 | 'id' => $id_objet |
@@ -90,9 +90,9 @@ discard block |
||
| 90 | 90 | // de connexion, et tout risque d'ambiguite |
| 91 | 91 | if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) { |
| 92 | 92 | $nom_cache_desc_sql[$serveur][$objets_sql] = |
| 93 | - _DIR_CACHE . 'sql_desc_' |
|
| 93 | + _DIR_CACHE.'sql_desc_' |
|
| 94 | 94 | . ($serveur ? "{$serveur}_" : '') |
| 95 | - . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8) |
|
| 95 | + . substr(md5($connexion['db'].':'.$connexion['prefixe'].":$objets_sql"), 0, 8) |
|
| 96 | 96 | . '.txt'; |
| 97 | 97 | // nouveau nom de cache = nouvelle version en memoire |
| 98 | 98 | unset($connexion['tables']); |
@@ -120,7 +120,7 @@ discard block |
||
| 120 | 120 | if ($connexion['spip_connect_version']) { |
| 121 | 121 | if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) { |
| 122 | 122 | $nom = $GLOBALS['table_des_tables'][$nom]; |
| 123 | - $nom_sql = 'spip_' . $nom; |
|
| 123 | + $nom_sql = 'spip_'.$nom; |
|
| 124 | 124 | } |
| 125 | 125 | } |
| 126 | 126 | |
@@ -147,12 +147,12 @@ discard block |
||
| 147 | 147 | // meme si pas d'abreviation declaree, trouver la table spip_$nom |
| 148 | 148 | // si c'est une table principale, |
| 149 | 149 | // puisqu'on le fait aussi pour les tables auxiliaires |
| 150 | - elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) { |
|
| 151 | - $nom_sql = 'spip_' . $nom; |
|
| 150 | + elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_'.$nom])) { |
|
| 151 | + $nom_sql = 'spip_'.$nom; |
|
| 152 | 152 | $fdesc = &$GLOBALS['tables_principales'][$nom_sql]; |
| 153 | 153 | } elseif ( |
| 154 | 154 | isset($GLOBALS['tables_auxiliaires'][$n = $nom]) |
| 155 | - or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) |
|
| 155 | + or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_'.$nom]) |
|
| 156 | 156 | ) { |
| 157 | 157 | $nom_sql = $n; |
| 158 | 158 | $fdesc = &$GLOBALS['tables_auxiliaires'][$n]; |
@@ -168,7 +168,7 @@ discard block |
||
| 168 | 168 | ) { |
| 169 | 169 | if (!$fdesc) { |
| 170 | 170 | $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG; |
| 171 | - spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level); |
|
| 171 | + spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base'.$log_level); |
|
| 172 | 172 | |
| 173 | 173 | return null; |
| 174 | 174 | } |
@@ -180,7 +180,7 @@ discard block |
||
| 180 | 180 | $desc['exist'] = true; |
| 181 | 181 | // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple) |
| 182 | 182 | // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une |
| 183 | - if (! $desc['key']) { |
|
| 183 | + if (!$desc['key']) { |
|
| 184 | 184 | spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base'); |
| 185 | 185 | unset($desc['key']); |
| 186 | 186 | } |
@@ -197,7 +197,7 @@ discard block |
||
| 197 | 197 | if (!isset($desc['key']) && !empty($fdesc['key'])) { |
| 198 | 198 | $desc['key'] = $fdesc['key']; |
| 199 | 199 | } |
| 200 | - if (! isset($desc['key'])) { |
|
| 200 | + if (!isset($desc['key'])) { |
|
| 201 | 201 | $desc['key'] = []; |
| 202 | 202 | } |
| 203 | 203 | |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\SQL\Tables |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | include_spip('base/objets'); |
| 22 | 22 | |
@@ -68,154 +68,154 @@ discard block |
||
| 68 | 68 | * |
| 69 | 69 | **/ |
| 70 | 70 | function base_trouver_table_dist($nom, $serveur = '', $table_spip = true, array $options = []) { |
| 71 | - $desc_cache = null; |
|
| 72 | - static $nom_cache_desc_sql = []; |
|
| 73 | - |
|
| 74 | - if ( |
|
| 75 | - !spip_connect($serveur) |
|
| 76 | - or !preg_match('/^[a-zA-Z0-9._-]*/', $nom) |
|
| 77 | - ) { |
|
| 78 | - return null; |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - $options = $options + [ |
|
| 82 | - // si false, baissera le niveau de log si une table demandée n’existe pas |
|
| 83 | - 'log_missing' => true, |
|
| 84 | - ]; |
|
| 85 | - |
|
| 86 | - $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 87 | - $objets_sql = lister_tables_objets_sql('::md5'); |
|
| 88 | - |
|
| 89 | - // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe |
|
| 90 | - // ce qui permet une auto invalidation en cas de modif manuelle du fichier |
|
| 91 | - // de connexion, et tout risque d'ambiguite |
|
| 92 | - if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) { |
|
| 93 | - $nom_cache_desc_sql[$serveur][$objets_sql] = |
|
| 94 | - _DIR_CACHE . 'sql_desc_' |
|
| 95 | - . ($serveur ? "{$serveur}_" : '') |
|
| 96 | - . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8) |
|
| 97 | - . '.txt'; |
|
| 98 | - // nouveau nom de cache = nouvelle version en memoire |
|
| 99 | - unset($connexion['tables']); |
|
| 100 | - } |
|
| 101 | - |
|
| 102 | - // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions |
|
| 103 | - if (!$nom) { |
|
| 104 | - spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]); |
|
| 105 | - $connexion['tables'] = []; |
|
| 106 | - |
|
| 107 | - return null; |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - $nom_sql = $nom; |
|
| 111 | - if (preg_match('/\.(.*)$/', $nom, $s)) { |
|
| 112 | - $nom_sql = $s[1]; |
|
| 113 | - } else { |
|
| 114 | - $nom_sql = $nom; |
|
| 115 | - } |
|
| 116 | - |
|
| 117 | - $fdesc = $desc = ''; |
|
| 118 | - $connexion = &$GLOBALS['connexions'][$serveur ?: 0]; |
|
| 119 | - |
|
| 120 | - // base sous SPIP: gerer les abreviations explicites des noms de table |
|
| 121 | - if ($connexion['spip_connect_version']) { |
|
| 122 | - if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) { |
|
| 123 | - $nom = $GLOBALS['table_des_tables'][$nom]; |
|
| 124 | - $nom_sql = 'spip_' . $nom; |
|
| 125 | - } |
|
| 126 | - } |
|
| 127 | - |
|
| 128 | - // si c'est la premiere table qu'on cherche |
|
| 129 | - // et si on est pas explicitement en recalcul |
|
| 130 | - // on essaye de recharger le cache des decriptions de ce serveur |
|
| 131 | - // dans le fichier cache |
|
| 132 | - if ( |
|
| 133 | - !isset($connexion['tables'][$nom_sql]) |
|
| 134 | - and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul' |
|
| 135 | - and (!isset($connexion['tables']) or !$connexion['tables']) |
|
| 136 | - ) { |
|
| 137 | - if ( |
|
| 138 | - lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache) |
|
| 139 | - and $desc_cache = unserialize($desc_cache) |
|
| 140 | - ) { |
|
| 141 | - $connexion['tables'] = $desc_cache; |
|
| 142 | - } |
|
| 143 | - } |
|
| 144 | - if ($table_spip and !isset($connexion['tables'][$nom_sql])) { |
|
| 145 | - if (isset($GLOBALS['tables_principales'][$nom_sql])) { |
|
| 146 | - $fdesc = $GLOBALS['tables_principales'][$nom_sql]; |
|
| 147 | - } |
|
| 148 | - // meme si pas d'abreviation declaree, trouver la table spip_$nom |
|
| 149 | - // si c'est une table principale, |
|
| 150 | - // puisqu'on le fait aussi pour les tables auxiliaires |
|
| 151 | - elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) { |
|
| 152 | - $nom_sql = 'spip_' . $nom; |
|
| 153 | - $fdesc = &$GLOBALS['tables_principales'][$nom_sql]; |
|
| 154 | - } elseif ( |
|
| 155 | - isset($GLOBALS['tables_auxiliaires'][$n = $nom]) |
|
| 156 | - or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) |
|
| 157 | - ) { |
|
| 158 | - $nom_sql = $n; |
|
| 159 | - $fdesc = &$GLOBALS['tables_auxiliaires'][$n]; |
|
| 160 | - } # table locale a cote de SPIP, comme non SPIP: |
|
| 161 | - } |
|
| 162 | - if (!isset($connexion['tables'][$nom_sql])) { |
|
| 163 | - // La *vraie* base a la priorite |
|
| 164 | - $exists = sql_table_exists($nom_sql, $table_spip, $serveur); |
|
| 165 | - if ( |
|
| 166 | - !$exists |
|
| 167 | - or !$desc = sql_showtable($nom_sql, $table_spip, $serveur) |
|
| 168 | - or !$desc['field'] |
|
| 169 | - ) { |
|
| 170 | - if (!$fdesc) { |
|
| 171 | - $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG; |
|
| 172 | - spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level); |
|
| 173 | - |
|
| 174 | - return null; |
|
| 175 | - } |
|
| 176 | - // on ne sait pas lire la structure de la table : |
|
| 177 | - // on retombe sur la description donnee dans les fichiers spip |
|
| 178 | - $desc = $fdesc; |
|
| 179 | - $desc['exist'] = false; |
|
| 180 | - } else { |
|
| 181 | - $desc['exist'] = true; |
|
| 182 | - // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple) |
|
| 183 | - // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une |
|
| 184 | - if (! $desc['key']) { |
|
| 185 | - spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base'); |
|
| 186 | - unset($desc['key']); |
|
| 187 | - } |
|
| 188 | - } |
|
| 189 | - |
|
| 190 | - $desc['table'] = $desc['table_sql'] = $nom_sql; |
|
| 191 | - $desc['connexion'] = $serveur; |
|
| 192 | - |
|
| 193 | - // charger les infos declarees pour cette table |
|
| 194 | - // en lui passant les infos connues |
|
| 195 | - // $desc est prioritaire pour la description de la table |
|
| 196 | - $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc); |
|
| 197 | - // s'assurer qu'on a toujours un 'key' |
|
| 198 | - if (!isset($desc['key']) && !empty($fdesc['key'])) { |
|
| 199 | - $desc['key'] = $fdesc['key']; |
|
| 200 | - } |
|
| 201 | - if (! isset($desc['key'])) { |
|
| 202 | - $desc['key'] = []; |
|
| 203 | - } |
|
| 204 | - |
|
| 205 | - // si tables_objets_sql est bien fini d'init, on peut cacher |
|
| 206 | - $connexion['tables'][$nom_sql] = $desc; |
|
| 207 | - $res = &$connexion['tables'][$nom_sql]; |
|
| 208 | - // une nouvelle table a ete decrite |
|
| 209 | - // mettons donc a jour le cache des descriptions de ce serveur |
|
| 210 | - if (is_writeable(_DIR_CACHE)) { |
|
| 211 | - ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true); |
|
| 212 | - } |
|
| 213 | - } else { |
|
| 214 | - $res = &$connexion['tables'][$nom_sql]; |
|
| 215 | - } |
|
| 216 | - |
|
| 217 | - // toujours retourner $nom dans id_table |
|
| 218 | - $res['id_table'] = $nom; |
|
| 219 | - |
|
| 220 | - return $res; |
|
| 71 | + $desc_cache = null; |
|
| 72 | + static $nom_cache_desc_sql = []; |
|
| 73 | + |
|
| 74 | + if ( |
|
| 75 | + !spip_connect($serveur) |
|
| 76 | + or !preg_match('/^[a-zA-Z0-9._-]*/', $nom) |
|
| 77 | + ) { |
|
| 78 | + return null; |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + $options = $options + [ |
|
| 82 | + // si false, baissera le niveau de log si une table demandée n’existe pas |
|
| 83 | + 'log_missing' => true, |
|
| 84 | + ]; |
|
| 85 | + |
|
| 86 | + $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; |
|
| 87 | + $objets_sql = lister_tables_objets_sql('::md5'); |
|
| 88 | + |
|
| 89 | + // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe |
|
| 90 | + // ce qui permet une auto invalidation en cas de modif manuelle du fichier |
|
| 91 | + // de connexion, et tout risque d'ambiguite |
|
| 92 | + if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) { |
|
| 93 | + $nom_cache_desc_sql[$serveur][$objets_sql] = |
|
| 94 | + _DIR_CACHE . 'sql_desc_' |
|
| 95 | + . ($serveur ? "{$serveur}_" : '') |
|
| 96 | + . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8) |
|
| 97 | + . '.txt'; |
|
| 98 | + // nouveau nom de cache = nouvelle version en memoire |
|
| 99 | + unset($connexion['tables']); |
|
| 100 | + } |
|
| 101 | + |
|
| 102 | + // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions |
|
| 103 | + if (!$nom) { |
|
| 104 | + spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]); |
|
| 105 | + $connexion['tables'] = []; |
|
| 106 | + |
|
| 107 | + return null; |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + $nom_sql = $nom; |
|
| 111 | + if (preg_match('/\.(.*)$/', $nom, $s)) { |
|
| 112 | + $nom_sql = $s[1]; |
|
| 113 | + } else { |
|
| 114 | + $nom_sql = $nom; |
|
| 115 | + } |
|
| 116 | + |
|
| 117 | + $fdesc = $desc = ''; |
|
| 118 | + $connexion = &$GLOBALS['connexions'][$serveur ?: 0]; |
|
| 119 | + |
|
| 120 | + // base sous SPIP: gerer les abreviations explicites des noms de table |
|
| 121 | + if ($connexion['spip_connect_version']) { |
|
| 122 | + if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) { |
|
| 123 | + $nom = $GLOBALS['table_des_tables'][$nom]; |
|
| 124 | + $nom_sql = 'spip_' . $nom; |
|
| 125 | + } |
|
| 126 | + } |
|
| 127 | + |
|
| 128 | + // si c'est la premiere table qu'on cherche |
|
| 129 | + // et si on est pas explicitement en recalcul |
|
| 130 | + // on essaye de recharger le cache des decriptions de ce serveur |
|
| 131 | + // dans le fichier cache |
|
| 132 | + if ( |
|
| 133 | + !isset($connexion['tables'][$nom_sql]) |
|
| 134 | + and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul' |
|
| 135 | + and (!isset($connexion['tables']) or !$connexion['tables']) |
|
| 136 | + ) { |
|
| 137 | + if ( |
|
| 138 | + lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache) |
|
| 139 | + and $desc_cache = unserialize($desc_cache) |
|
| 140 | + ) { |
|
| 141 | + $connexion['tables'] = $desc_cache; |
|
| 142 | + } |
|
| 143 | + } |
|
| 144 | + if ($table_spip and !isset($connexion['tables'][$nom_sql])) { |
|
| 145 | + if (isset($GLOBALS['tables_principales'][$nom_sql])) { |
|
| 146 | + $fdesc = $GLOBALS['tables_principales'][$nom_sql]; |
|
| 147 | + } |
|
| 148 | + // meme si pas d'abreviation declaree, trouver la table spip_$nom |
|
| 149 | + // si c'est une table principale, |
|
| 150 | + // puisqu'on le fait aussi pour les tables auxiliaires |
|
| 151 | + elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) { |
|
| 152 | + $nom_sql = 'spip_' . $nom; |
|
| 153 | + $fdesc = &$GLOBALS['tables_principales'][$nom_sql]; |
|
| 154 | + } elseif ( |
|
| 155 | + isset($GLOBALS['tables_auxiliaires'][$n = $nom]) |
|
| 156 | + or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) |
|
| 157 | + ) { |
|
| 158 | + $nom_sql = $n; |
|
| 159 | + $fdesc = &$GLOBALS['tables_auxiliaires'][$n]; |
|
| 160 | + } # table locale a cote de SPIP, comme non SPIP: |
|
| 161 | + } |
|
| 162 | + if (!isset($connexion['tables'][$nom_sql])) { |
|
| 163 | + // La *vraie* base a la priorite |
|
| 164 | + $exists = sql_table_exists($nom_sql, $table_spip, $serveur); |
|
| 165 | + if ( |
|
| 166 | + !$exists |
|
| 167 | + or !$desc = sql_showtable($nom_sql, $table_spip, $serveur) |
|
| 168 | + or !$desc['field'] |
|
| 169 | + ) { |
|
| 170 | + if (!$fdesc) { |
|
| 171 | + $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG; |
|
| 172 | + spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level); |
|
| 173 | + |
|
| 174 | + return null; |
|
| 175 | + } |
|
| 176 | + // on ne sait pas lire la structure de la table : |
|
| 177 | + // on retombe sur la description donnee dans les fichiers spip |
|
| 178 | + $desc = $fdesc; |
|
| 179 | + $desc['exist'] = false; |
|
| 180 | + } else { |
|
| 181 | + $desc['exist'] = true; |
|
| 182 | + // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple) |
|
| 183 | + // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une |
|
| 184 | + if (! $desc['key']) { |
|
| 185 | + spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base'); |
|
| 186 | + unset($desc['key']); |
|
| 187 | + } |
|
| 188 | + } |
|
| 189 | + |
|
| 190 | + $desc['table'] = $desc['table_sql'] = $nom_sql; |
|
| 191 | + $desc['connexion'] = $serveur; |
|
| 192 | + |
|
| 193 | + // charger les infos declarees pour cette table |
|
| 194 | + // en lui passant les infos connues |
|
| 195 | + // $desc est prioritaire pour la description de la table |
|
| 196 | + $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc); |
|
| 197 | + // s'assurer qu'on a toujours un 'key' |
|
| 198 | + if (!isset($desc['key']) && !empty($fdesc['key'])) { |
|
| 199 | + $desc['key'] = $fdesc['key']; |
|
| 200 | + } |
|
| 201 | + if (! isset($desc['key'])) { |
|
| 202 | + $desc['key'] = []; |
|
| 203 | + } |
|
| 204 | + |
|
| 205 | + // si tables_objets_sql est bien fini d'init, on peut cacher |
|
| 206 | + $connexion['tables'][$nom_sql] = $desc; |
|
| 207 | + $res = &$connexion['tables'][$nom_sql]; |
|
| 208 | + // une nouvelle table a ete decrite |
|
| 209 | + // mettons donc a jour le cache des descriptions de ce serveur |
|
| 210 | + if (is_writeable(_DIR_CACHE)) { |
|
| 211 | + ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true); |
|
| 212 | + } |
|
| 213 | + } else { |
|
| 214 | + $res = &$connexion['tables'][$nom_sql]; |
|
| 215 | + } |
|
| 216 | + |
|
| 217 | + // toujours retourner $nom dans id_table |
|
| 218 | + $res['id_table'] = $nom; |
|
| 219 | + |
|
| 220 | + return $res; |
|
| 221 | 221 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Fichier |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | /** |
@@ -36,28 +36,28 @@ discard block |
||
| 36 | 36 | */ |
| 37 | 37 | function spip_livrer_fichier($fichier, $content_type = 'application/octet-stream', $options = []) { |
| 38 | 38 | |
| 39 | - $defaut = [ |
|
| 40 | - 'attachment' => false, |
|
| 41 | - 'expires' => 3600, |
|
| 42 | - 'range' => null |
|
| 43 | - ]; |
|
| 44 | - $options = array_merge($defaut, $options); |
|
| 45 | - if (is_numeric($options['expire']) and $options['expire'] > 0) { |
|
| 46 | - $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT'; |
|
| 47 | - } |
|
| 48 | - |
|
| 49 | - if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) { |
|
| 50 | - $options['range'] = $_SERVER['HTTP_RANGE']; |
|
| 51 | - } |
|
| 52 | - |
|
| 53 | - spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']); |
|
| 54 | - |
|
| 55 | - if (!is_null($options['range'])) { |
|
| 56 | - spip_livrer_fichier_partie($fichier, $options['range']); |
|
| 57 | - } |
|
| 58 | - else { |
|
| 59 | - spip_livrer_fichier_entier($fichier); |
|
| 60 | - } |
|
| 39 | + $defaut = [ |
|
| 40 | + 'attachment' => false, |
|
| 41 | + 'expires' => 3600, |
|
| 42 | + 'range' => null |
|
| 43 | + ]; |
|
| 44 | + $options = array_merge($defaut, $options); |
|
| 45 | + if (is_numeric($options['expire']) and $options['expire'] > 0) { |
|
| 46 | + $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT'; |
|
| 47 | + } |
|
| 48 | + |
|
| 49 | + if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) { |
|
| 50 | + $options['range'] = $_SERVER['HTTP_RANGE']; |
|
| 51 | + } |
|
| 52 | + |
|
| 53 | + spip_livrer_fichier_entetes($fichier, $content_type, $options['attachment'] && !$options['range'], $options['expires']); |
|
| 54 | + |
|
| 55 | + if (!is_null($options['range'])) { |
|
| 56 | + spip_livrer_fichier_partie($fichier, $options['range']); |
|
| 57 | + } |
|
| 58 | + else { |
|
| 59 | + spip_livrer_fichier_entier($fichier); |
|
| 60 | + } |
|
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | /** |
@@ -70,28 +70,28 @@ discard block |
||
| 70 | 70 | * @param int|string $expires |
| 71 | 71 | */ |
| 72 | 72 | function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) { |
| 73 | - // toujours envoyer un content type, meme vide ! |
|
| 74 | - header('Accept-Ranges: bytes'); |
|
| 75 | - header('Content-Type: ' . $content_type); |
|
| 76 | - |
|
| 77 | - if ($attachment) { |
|
| 78 | - $f = basename($fichier); |
|
| 79 | - // ce content-type est necessaire pour eviter des corruptions de zip dans ie6 |
|
| 80 | - header('Content-Type: application/octet-stream'); |
|
| 81 | - |
|
| 82 | - header("Content-Disposition: attachment; filename=\"$f\";"); |
|
| 83 | - header('Content-Transfer-Encoding: binary'); |
|
| 84 | - |
|
| 85 | - // fix for IE caching or PHP bug issue |
|
| 86 | - header('Expires: 0'); // set expiration time |
|
| 87 | - header('Pragma: public'); |
|
| 88 | - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
|
| 89 | - } |
|
| 90 | - else { |
|
| 91 | - $f = basename($fichier); |
|
| 92 | - header("Content-Disposition: inline; filename=\"$f\";"); |
|
| 93 | - header('Expires: ' . $expires); // set expiration time |
|
| 94 | - } |
|
| 73 | + // toujours envoyer un content type, meme vide ! |
|
| 74 | + header('Accept-Ranges: bytes'); |
|
| 75 | + header('Content-Type: ' . $content_type); |
|
| 76 | + |
|
| 77 | + if ($attachment) { |
|
| 78 | + $f = basename($fichier); |
|
| 79 | + // ce content-type est necessaire pour eviter des corruptions de zip dans ie6 |
|
| 80 | + header('Content-Type: application/octet-stream'); |
|
| 81 | + |
|
| 82 | + header("Content-Disposition: attachment; filename=\"$f\";"); |
|
| 83 | + header('Content-Transfer-Encoding: binary'); |
|
| 84 | + |
|
| 85 | + // fix for IE caching or PHP bug issue |
|
| 86 | + header('Expires: 0'); // set expiration time |
|
| 87 | + header('Pragma: public'); |
|
| 88 | + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
|
| 89 | + } |
|
| 90 | + else { |
|
| 91 | + $f = basename($fichier); |
|
| 92 | + header("Content-Disposition: inline; filename=\"$f\";"); |
|
| 93 | + header('Expires: ' . $expires); // set expiration time |
|
| 94 | + } |
|
| 95 | 95 | } |
| 96 | 96 | |
| 97 | 97 | /** |
@@ -99,20 +99,20 @@ discard block |
||
| 99 | 99 | * @param string $fichier |
| 100 | 100 | */ |
| 101 | 101 | function spip_livrer_fichier_entier($fichier) { |
| 102 | - if (!file_exists($fichier)) { |
|
| 103 | - throw new \Exception(sprintf('File not found: %s', $fichier)); |
|
| 104 | - } |
|
| 102 | + if (!file_exists($fichier)) { |
|
| 103 | + throw new \Exception(sprintf('File not found: %s', $fichier)); |
|
| 104 | + } |
|
| 105 | 105 | |
| 106 | - if (!is_readable($fichier)) { |
|
| 107 | - throw new \Exception(sprintf('File not readable: %s', $fichier)); |
|
| 108 | - } |
|
| 106 | + if (!is_readable($fichier)) { |
|
| 107 | + throw new \Exception(sprintf('File not readable: %s', $fichier)); |
|
| 108 | + } |
|
| 109 | 109 | |
| 110 | - if ($size = filesize($fichier)) { |
|
| 111 | - header(sprintf('Content-Length: %d', $size)); |
|
| 112 | - } |
|
| 110 | + if ($size = filesize($fichier)) { |
|
| 111 | + header(sprintf('Content-Length: %d', $size)); |
|
| 112 | + } |
|
| 113 | 113 | |
| 114 | - readfile($fichier); |
|
| 115 | - exit(); |
|
| 114 | + readfile($fichier); |
|
| 115 | + exit(); |
|
| 116 | 116 | } |
| 117 | 117 | |
| 118 | 118 | /** |
@@ -125,98 +125,98 @@ discard block |
||
| 125 | 125 | * @throws Exception |
| 126 | 126 | */ |
| 127 | 127 | function spip_livrer_fichier_partie($fichier, $range = null) { |
| 128 | - if (!file_exists($fichier)) { |
|
| 129 | - throw new \Exception(sprintf('File not found: %s', $fichier)); |
|
| 130 | - } |
|
| 128 | + if (!file_exists($fichier)) { |
|
| 129 | + throw new \Exception(sprintf('File not found: %s', $fichier)); |
|
| 130 | + } |
|
| 131 | 131 | |
| 132 | - if (!is_readable($fichier)) { |
|
| 133 | - throw new \Exception(sprintf('File not readable: %s', $fichier)); |
|
| 134 | - } |
|
| 132 | + if (!is_readable($fichier)) { |
|
| 133 | + throw new \Exception(sprintf('File not readable: %s', $fichier)); |
|
| 134 | + } |
|
| 135 | 135 | |
| 136 | 136 | |
| 137 | - // Par defaut on envoie tout |
|
| 138 | - $byteOffset = 0; |
|
| 139 | - $byteLength = $fileSize = filesize($fichier); |
|
| 137 | + // Par defaut on envoie tout |
|
| 138 | + $byteOffset = 0; |
|
| 139 | + $byteLength = $fileSize = filesize($fichier); |
|
| 140 | 140 | |
| 141 | 141 | |
| 142 | - // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451" |
|
| 143 | - if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) { |
|
| 144 | - ### Offset signifies where we should begin to read the file |
|
| 145 | - $byteOffset = (int)$match[1]; |
|
| 142 | + // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451" |
|
| 143 | + if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) { |
|
| 144 | + ### Offset signifies where we should begin to read the file |
|
| 145 | + $byteOffset = (int)$match[1]; |
|
| 146 | 146 | |
| 147 | 147 | |
| 148 | - ### Length is for how long we should read the file according to the browser, and can never go beyond the file size |
|
| 149 | - if (isset($match[2])) { |
|
| 150 | - $finishBytes = (int)$match[2]; |
|
| 151 | - $byteLength = $finishBytes + 1; |
|
| 152 | - } else { |
|
| 153 | - $finishBytes = $fileSize - 1; |
|
| 154 | - } |
|
| 148 | + ### Length is for how long we should read the file according to the browser, and can never go beyond the file size |
|
| 149 | + if (isset($match[2])) { |
|
| 150 | + $finishBytes = (int)$match[2]; |
|
| 151 | + $byteLength = $finishBytes + 1; |
|
| 152 | + } else { |
|
| 153 | + $finishBytes = $fileSize - 1; |
|
| 154 | + } |
|
| 155 | 155 | |
| 156 | - $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize); |
|
| 157 | - } |
|
| 158 | - else { |
|
| 159 | - // si pas de range valide, on delegue a la methode d'envoi complet |
|
| 160 | - spip_livrer_fichier_entier($fichier); |
|
| 161 | - // redondant, mais facilite la comprehension du code |
|
| 162 | - exit(); |
|
| 163 | - } |
|
| 156 | + $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize); |
|
| 157 | + } |
|
| 158 | + else { |
|
| 159 | + // si pas de range valide, on delegue a la methode d'envoi complet |
|
| 160 | + spip_livrer_fichier_entier($fichier); |
|
| 161 | + // redondant, mais facilite la comprehension du code |
|
| 162 | + exit(); |
|
| 163 | + } |
|
| 164 | 164 | |
| 165 | - // Remove headers that might unnecessarily clutter up the output |
|
| 166 | - header_remove('Cache-Control'); |
|
| 167 | - header_remove('Pragma'); |
|
| 165 | + // Remove headers that might unnecessarily clutter up the output |
|
| 166 | + header_remove('Cache-Control'); |
|
| 167 | + header_remove('Pragma'); |
|
| 168 | 168 | |
| 169 | - // partial content |
|
| 170 | - header('HTTP/1.1 206 Partial content'); |
|
| 171 | - header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent |
|
| 169 | + // partial content |
|
| 170 | + header('HTTP/1.1 206 Partial content'); |
|
| 171 | + header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent |
|
| 172 | 172 | |
| 173 | 173 | |
| 174 | - $byteRange = $byteLength - $byteOffset; |
|
| 174 | + $byteRange = $byteLength - $byteOffset; |
|
| 175 | 175 | |
| 176 | - header(sprintf('Content-Length: %d', $byteRange)); |
|
| 176 | + header(sprintf('Content-Length: %d', $byteRange)); |
|
| 177 | 177 | |
| 178 | - // Variable containing the buffer |
|
| 179 | - $buffer = ''; |
|
| 180 | - // Just a reasonable buffer size |
|
| 181 | - $bufferSize = 512 * 16; |
|
| 182 | - // Contains how much is left to read of the byteRange |
|
| 183 | - $bytePool = $byteRange; |
|
| 178 | + // Variable containing the buffer |
|
| 179 | + $buffer = ''; |
|
| 180 | + // Just a reasonable buffer size |
|
| 181 | + $bufferSize = 512 * 16; |
|
| 182 | + // Contains how much is left to read of the byteRange |
|
| 183 | + $bytePool = $byteRange; |
|
| 184 | 184 | |
| 185 | - if (!$handle = fopen($fichier, 'r')) { |
|
| 186 | - throw new \Exception(sprintf('Could not get handle for file %s', $fichier)); |
|
| 187 | - } |
|
| 185 | + if (!$handle = fopen($fichier, 'r')) { |
|
| 186 | + throw new \Exception(sprintf('Could not get handle for file %s', $fichier)); |
|
| 187 | + } |
|
| 188 | 188 | |
| 189 | - if (fseek($handle, $byteOffset, SEEK_SET) == -1) { |
|
| 190 | - throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset)); |
|
| 191 | - } |
|
| 189 | + if (fseek($handle, $byteOffset, SEEK_SET) == -1) { |
|
| 190 | + throw new \Exception(sprintf('Could not seek to byte offset %d', $byteOffset)); |
|
| 191 | + } |
|
| 192 | 192 | |
| 193 | 193 | |
| 194 | - while ($bytePool > 0) { |
|
| 195 | - // How many bytes we request on this iteration |
|
| 196 | - $chunkSizeRequested = min($bufferSize, $bytePool); |
|
| 194 | + while ($bytePool > 0) { |
|
| 195 | + // How many bytes we request on this iteration |
|
| 196 | + $chunkSizeRequested = min($bufferSize, $bytePool); |
|
| 197 | 197 | |
| 198 | - // Try readin $chunkSizeRequested bytes from $handle and put data in $buffer |
|
| 199 | - $buffer = fread($handle, $chunkSizeRequested); |
|
| 198 | + // Try readin $chunkSizeRequested bytes from $handle and put data in $buffer |
|
| 199 | + $buffer = fread($handle, $chunkSizeRequested); |
|
| 200 | 200 | |
| 201 | - // Store how many bytes were actually read |
|
| 202 | - $chunkSizeActual = strlen($buffer); |
|
| 201 | + // Store how many bytes were actually read |
|
| 202 | + $chunkSizeActual = strlen($buffer); |
|
| 203 | 203 | |
| 204 | - // If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already |
|
| 205 | - if ($chunkSizeActual == 0) { |
|
| 206 | - // For production servers this should go in your php error log, since it will break the output |
|
| 207 | - trigger_error('Chunksize became 0', E_USER_WARNING); |
|
| 208 | - break; |
|
| 209 | - } |
|
| 204 | + // If we didn't get any bytes that means something unexpected has happened since $bytePool should be zero already |
|
| 205 | + if ($chunkSizeActual == 0) { |
|
| 206 | + // For production servers this should go in your php error log, since it will break the output |
|
| 207 | + trigger_error('Chunksize became 0', E_USER_WARNING); |
|
| 208 | + break; |
|
| 209 | + } |
|
| 210 | 210 | |
| 211 | - // Decrease byte pool with amount of bytes that were read during this iteration |
|
| 212 | - $bytePool -= $chunkSizeActual; |
|
| 211 | + // Decrease byte pool with amount of bytes that were read during this iteration |
|
| 212 | + $bytePool -= $chunkSizeActual; |
|
| 213 | 213 | |
| 214 | - // Write the buffer to output |
|
| 215 | - print $buffer; |
|
| 214 | + // Write the buffer to output |
|
| 215 | + print $buffer; |
|
| 216 | 216 | |
| 217 | - // Try to output the data to the client immediately |
|
| 218 | - flush(); |
|
| 219 | - } |
|
| 217 | + // Try to output the data to the client immediately |
|
| 218 | + flush(); |
|
| 219 | + } |
|
| 220 | 220 | |
| 221 | - exit(); |
|
| 221 | + exit(); |
|
| 222 | 222 | } |
@@ -43,7 +43,7 @@ discard block |
||
| 43 | 43 | ]; |
| 44 | 44 | $options = array_merge($defaut, $options); |
| 45 | 45 | if (is_numeric($options['expire']) and $options['expire'] > 0) { |
| 46 | - $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']) . ' GMT'; |
|
| 46 | + $options['expire'] = gmdate('D, d M Y H:i:s', time() + $options['expires']).' GMT'; |
|
| 47 | 47 | } |
| 48 | 48 | |
| 49 | 49 | if (is_null($options) and isset($_SERVER['HTTP_RANGE'])) { |
@@ -72,7 +72,7 @@ discard block |
||
| 72 | 72 | function spip_livrer_fichier_entetes($fichier, $content_type = 'application/octet-stream', $attachment = false, $expires = 0) { |
| 73 | 73 | // toujours envoyer un content type, meme vide ! |
| 74 | 74 | header('Accept-Ranges: bytes'); |
| 75 | - header('Content-Type: ' . $content_type); |
|
| 75 | + header('Content-Type: '.$content_type); |
|
| 76 | 76 | |
| 77 | 77 | if ($attachment) { |
| 78 | 78 | $f = basename($fichier); |
@@ -90,7 +90,7 @@ discard block |
||
| 90 | 90 | else { |
| 91 | 91 | $f = basename($fichier); |
| 92 | 92 | header("Content-Disposition: inline; filename=\"$f\";"); |
| 93 | - header('Expires: ' . $expires); // set expiration time |
|
| 93 | + header('Expires: '.$expires); // set expiration time |
|
| 94 | 94 | } |
| 95 | 95 | } |
| 96 | 96 | |
@@ -142,12 +142,12 @@ discard block |
||
| 142 | 142 | // Parse Content-Range header for byte offsets, looks like "bytes=11525-" OR "bytes=11525-12451" |
| 143 | 143 | if ($range and preg_match('%bytes=(\d+)-(\d+)?%i', $range, $match)) { |
| 144 | 144 | ### Offset signifies where we should begin to read the file |
| 145 | - $byteOffset = (int)$match[1]; |
|
| 145 | + $byteOffset = (int) $match[1]; |
|
| 146 | 146 | |
| 147 | 147 | |
| 148 | 148 | ### Length is for how long we should read the file according to the browser, and can never go beyond the file size |
| 149 | 149 | if (isset($match[2])) { |
| 150 | - $finishBytes = (int)$match[2]; |
|
| 150 | + $finishBytes = (int) $match[2]; |
|
| 151 | 151 | $byteLength = $finishBytes + 1; |
| 152 | 152 | } else { |
| 153 | 153 | $finishBytes = $fileSize - 1; |
@@ -168,7 +168,7 @@ discard block |
||
| 168 | 168 | |
| 169 | 169 | // partial content |
| 170 | 170 | header('HTTP/1.1 206 Partial content'); |
| 171 | - header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent |
|
| 171 | + header($cr_header); ### Decrease by 1 on byte-length since this definition is zero-based index of bytes being sent |
|
| 172 | 172 | |
| 173 | 173 | |
| 174 | 174 | $byteRange = $byteLength - $byteOffset; |
@@ -54,8 +54,7 @@ discard block |
||
| 54 | 54 | |
| 55 | 55 | if (!is_null($options['range'])) { |
| 56 | 56 | spip_livrer_fichier_partie($fichier, $options['range']); |
| 57 | - } |
|
| 58 | - else { |
|
| 57 | + } else { |
|
| 59 | 58 | spip_livrer_fichier_entier($fichier); |
| 60 | 59 | } |
| 61 | 60 | } |
@@ -86,8 +85,7 @@ discard block |
||
| 86 | 85 | header('Expires: 0'); // set expiration time |
| 87 | 86 | header('Pragma: public'); |
| 88 | 87 | header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); |
| 89 | - } |
|
| 90 | - else { |
|
| 88 | + } else { |
|
| 91 | 89 | $f = basename($fichier); |
| 92 | 90 | header("Content-Disposition: inline; filename=\"$f\";"); |
| 93 | 91 | header('Expires: ' . $expires); // set expiration time |
@@ -154,8 +152,7 @@ discard block |
||
| 154 | 152 | } |
| 155 | 153 | |
| 156 | 154 | $cr_header = sprintf('Content-Range: bytes %d-%d/%d', $byteOffset, $finishBytes, $fileSize); |
| 157 | - } |
|
| 158 | - else { |
|
| 155 | + } else { |
|
| 159 | 156 | // si pas de range valide, on delegue a la methode d'envoi complet |
| 160 | 157 | spip_livrer_fichier_entier($fichier); |
| 161 | 158 | // redondant, mais facilite la comprehension du code |
@@ -116,8 +116,7 @@ discard block |
||
| 116 | 116 | ); |
| 117 | 117 | if (!$res or (!$res['length'] and $res['status'] != 304)) { |
| 118 | 118 | spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
| 119 | - } |
|
| 120 | - else { |
|
| 119 | + } else { |
|
| 121 | 120 | spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
| 122 | 121 | } |
| 123 | 122 | if (!$res or !$res['length']) { |
@@ -222,8 +221,7 @@ discard block |
||
| 222 | 221 | break; |
| 223 | 222 | } |
| 224 | 223 | } |
| 225 | - } |
|
| 226 | - else { |
|
| 224 | + } else { |
|
| 227 | 225 | $ip = false; |
| 228 | 226 | } |
| 229 | 227 | } |
@@ -16,32 +16,32 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Distant |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | if (!defined('_INC_DISTANT_VERSION_HTTP')) { |
| 23 | - define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0'); |
|
| 23 | + define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0'); |
|
| 24 | 24 | } |
| 25 | 25 | if (!defined('_INC_DISTANT_CONTENT_ENCODING')) { |
| 26 | - define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
|
| 26 | + define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
|
| 27 | 27 | } |
| 28 | 28 | if (!defined('_INC_DISTANT_USER_AGENT')) { |
| 29 | - define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 29 | + define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 30 | 30 | } |
| 31 | 31 | if (!defined('_INC_DISTANT_MAX_SIZE')) { |
| 32 | - define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
|
| 32 | + define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
|
| 33 | 33 | } |
| 34 | 34 | if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) { |
| 35 | - define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
|
| 35 | + define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
|
| 36 | 36 | } |
| 37 | 37 | |
| 38 | 38 | define('_REGEXP_COPIE_LOCALE', ',' . |
| 39 | - preg_replace( |
|
| 40 | - '@^https?:@', |
|
| 41 | - 'https?:', |
|
| 42 | - ($GLOBALS['meta']['adresse_site'] ?? '') |
|
| 43 | - ) |
|
| 44 | - . '/?spip.php[?]action=acceder_document.*file=(.*)$,'); |
|
| 39 | + preg_replace( |
|
| 40 | + '@^https?:@', |
|
| 41 | + 'https?:', |
|
| 42 | + ($GLOBALS['meta']['adresse_site'] ?? '') |
|
| 43 | + ) |
|
| 44 | + . '/?spip.php[?]action=acceder_document.*file=(.*)$,'); |
|
| 45 | 45 | |
| 46 | 46 | //@define('_COPIE_LOCALE_MAX_SIZE',2097152); // poids (inc/utils l'a fait) |
| 47 | 47 | |
@@ -68,89 +68,89 @@ discard block |
||
| 68 | 68 | */ |
| 69 | 69 | function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null) { |
| 70 | 70 | |
| 71 | - // si c'est la protection de soi-meme, retourner le path |
|
| 72 | - if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
|
| 73 | - $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 74 | - |
|
| 75 | - return @file_exists($source) ? $source : false; |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - if (is_null($local)) { |
|
| 79 | - $local = fichier_copie_locale($source); |
|
| 80 | - } else { |
|
| 81 | - if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { |
|
| 82 | - $local = substr($local, strlen(_DIR_RACINE)); |
|
| 83 | - } |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - // si $local = '' c'est un fichier refuse par fichier_copie_locale(), |
|
| 87 | - // par exemple un fichier qui ne figure pas dans nos documents ; |
|
| 88 | - // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer |
|
| 89 | - if (!$local) { |
|
| 90 | - return false; |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - $localrac = _DIR_RACINE . $local; |
|
| 94 | - $t = ($mode === 'force') ? false : @file_exists($localrac); |
|
| 95 | - |
|
| 96 | - // test d'existence du fichier |
|
| 97 | - if ($mode === 'test') { |
|
| 98 | - return $t ? $local : ''; |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - // sinon voir si on doit/peut le telecharger |
|
| 102 | - if ($local === $source or !tester_url_absolue($source)) { |
|
| 103 | - return $local; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - if ($mode === 'modif' or !$t) { |
|
| 107 | - // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation |
|
| 108 | - // et des eventuelles recuperations concurantes |
|
| 109 | - include_spip('inc/acces'); |
|
| 110 | - if (!$taille_max) { |
|
| 111 | - $taille_max = _COPIE_LOCALE_MAX_SIZE; |
|
| 112 | - } |
|
| 113 | - $res = recuperer_url( |
|
| 114 | - $source, |
|
| 115 | - ['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
|
| 116 | - ); |
|
| 117 | - if (!$res or (!$res['length'] and $res['status'] != 304)) { |
|
| 118 | - spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 119 | - } |
|
| 120 | - else { |
|
| 121 | - spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 122 | - } |
|
| 123 | - if (!$res or !$res['length']) { |
|
| 124 | - // si $t c'est sans doute juste un not-modified-since |
|
| 125 | - return $t ? $local : false; |
|
| 126 | - } |
|
| 127 | - |
|
| 128 | - // si on retrouve l'extension |
|
| 129 | - if ( |
|
| 130 | - !empty($res['headers']) |
|
| 131 | - and $extension = distant_trouver_extension_selon_headers($source, $res['headers']) |
|
| 132 | - ) { |
|
| 133 | - if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) { |
|
| 134 | - $sanitizer($localrac); |
|
| 135 | - } |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - // pour une eventuelle indexation |
|
| 139 | - pipeline( |
|
| 140 | - 'post_edition', |
|
| 141 | - [ |
|
| 142 | - 'args' => [ |
|
| 143 | - 'operation' => 'copie_locale', |
|
| 144 | - 'source' => $source, |
|
| 145 | - 'fichier' => $local, |
|
| 146 | - 'http_res' => $res['length'], |
|
| 147 | - ], |
|
| 148 | - 'data' => null |
|
| 149 | - ] |
|
| 150 | - ); |
|
| 151 | - } |
|
| 152 | - |
|
| 153 | - return $local; |
|
| 71 | + // si c'est la protection de soi-meme, retourner le path |
|
| 72 | + if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
|
| 73 | + $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 74 | + |
|
| 75 | + return @file_exists($source) ? $source : false; |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + if (is_null($local)) { |
|
| 79 | + $local = fichier_copie_locale($source); |
|
| 80 | + } else { |
|
| 81 | + if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { |
|
| 82 | + $local = substr($local, strlen(_DIR_RACINE)); |
|
| 83 | + } |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + // si $local = '' c'est un fichier refuse par fichier_copie_locale(), |
|
| 87 | + // par exemple un fichier qui ne figure pas dans nos documents ; |
|
| 88 | + // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer |
|
| 89 | + if (!$local) { |
|
| 90 | + return false; |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + $localrac = _DIR_RACINE . $local; |
|
| 94 | + $t = ($mode === 'force') ? false : @file_exists($localrac); |
|
| 95 | + |
|
| 96 | + // test d'existence du fichier |
|
| 97 | + if ($mode === 'test') { |
|
| 98 | + return $t ? $local : ''; |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + // sinon voir si on doit/peut le telecharger |
|
| 102 | + if ($local === $source or !tester_url_absolue($source)) { |
|
| 103 | + return $local; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + if ($mode === 'modif' or !$t) { |
|
| 107 | + // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation |
|
| 108 | + // et des eventuelles recuperations concurantes |
|
| 109 | + include_spip('inc/acces'); |
|
| 110 | + if (!$taille_max) { |
|
| 111 | + $taille_max = _COPIE_LOCALE_MAX_SIZE; |
|
| 112 | + } |
|
| 113 | + $res = recuperer_url( |
|
| 114 | + $source, |
|
| 115 | + ['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
|
| 116 | + ); |
|
| 117 | + if (!$res or (!$res['length'] and $res['status'] != 304)) { |
|
| 118 | + spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 119 | + } |
|
| 120 | + else { |
|
| 121 | + spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 122 | + } |
|
| 123 | + if (!$res or !$res['length']) { |
|
| 124 | + // si $t c'est sans doute juste un not-modified-since |
|
| 125 | + return $t ? $local : false; |
|
| 126 | + } |
|
| 127 | + |
|
| 128 | + // si on retrouve l'extension |
|
| 129 | + if ( |
|
| 130 | + !empty($res['headers']) |
|
| 131 | + and $extension = distant_trouver_extension_selon_headers($source, $res['headers']) |
|
| 132 | + ) { |
|
| 133 | + if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) { |
|
| 134 | + $sanitizer($localrac); |
|
| 135 | + } |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + // pour une eventuelle indexation |
|
| 139 | + pipeline( |
|
| 140 | + 'post_edition', |
|
| 141 | + [ |
|
| 142 | + 'args' => [ |
|
| 143 | + 'operation' => 'copie_locale', |
|
| 144 | + 'source' => $source, |
|
| 145 | + 'fichier' => $local, |
|
| 146 | + 'http_res' => $res['length'], |
|
| 147 | + ], |
|
| 148 | + 'data' => null |
|
| 149 | + ] |
|
| 150 | + ); |
|
| 151 | + } |
|
| 152 | + |
|
| 153 | + return $local; |
|
| 154 | 154 | } |
| 155 | 155 | |
| 156 | 156 | /** |
@@ -165,99 +165,99 @@ discard block |
||
| 165 | 165 | * url ou false en cas d'echec |
| 166 | 166 | */ |
| 167 | 167 | function valider_url_distante($url, $known_hosts = []) { |
| 168 | - if (!function_exists('protocole_verifier')) { |
|
| 169 | - include_spip('inc/filtres_mini'); |
|
| 170 | - } |
|
| 171 | - |
|
| 172 | - if (!protocole_verifier($url, ['http', 'https'])) { |
|
| 173 | - return false; |
|
| 174 | - } |
|
| 175 | - |
|
| 176 | - $parsed_url = parse_url($url); |
|
| 177 | - if (!$parsed_url or empty($parsed_url['host'])) { |
|
| 178 | - return false; |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - if (isset($parsed_url['user']) or isset($parsed_url['pass'])) { |
|
| 182 | - return false; |
|
| 183 | - } |
|
| 184 | - |
|
| 185 | - if (false !== strpbrk($parsed_url['host'], ':#?[]')) { |
|
| 186 | - return false; |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - if (!is_array($known_hosts)) { |
|
| 190 | - $known_hosts = [$known_hosts]; |
|
| 191 | - } |
|
| 192 | - $known_hosts[] = $GLOBALS['meta']['adresse_site']; |
|
| 193 | - $known_hosts[] = url_de_base(); |
|
| 194 | - $known_hosts = pipeline('declarer_hosts_distants', $known_hosts); |
|
| 195 | - |
|
| 196 | - $is_known_host = false; |
|
| 197 | - foreach ($known_hosts as $known_host) { |
|
| 198 | - $parse_known = parse_url($known_host); |
|
| 199 | - if ( |
|
| 200 | - $parse_known |
|
| 201 | - and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 202 | - ) { |
|
| 203 | - $is_known_host = true; |
|
| 204 | - break; |
|
| 205 | - } |
|
| 206 | - } |
|
| 207 | - |
|
| 208 | - if (!$is_known_host) { |
|
| 209 | - $host = trim($parsed_url['host'], '.'); |
|
| 210 | - if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 211 | - $ip = gethostbyname($host); |
|
| 212 | - if ($ip === $host) { |
|
| 213 | - // Error condition for gethostbyname() |
|
| 214 | - $ip = false; |
|
| 215 | - } |
|
| 216 | - if ($records = dns_get_record($host)) { |
|
| 217 | - foreach ($records as $record) { |
|
| 218 | - // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit |
|
| 219 | - // se fasse sur la meme IP |
|
| 220 | - if ($record['ttl'] < 10) { |
|
| 221 | - $ip = false; |
|
| 222 | - break; |
|
| 223 | - } |
|
| 224 | - } |
|
| 225 | - } |
|
| 226 | - else { |
|
| 227 | - $ip = false; |
|
| 228 | - } |
|
| 229 | - } |
|
| 230 | - if ($ip) { |
|
| 231 | - if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 232 | - return false; |
|
| 233 | - } |
|
| 234 | - } |
|
| 235 | - } |
|
| 236 | - |
|
| 237 | - if (empty($parsed_url['port'])) { |
|
| 238 | - return $url; |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - $port = $parsed_url['port']; |
|
| 242 | - if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 243 | - return $url; |
|
| 244 | - } |
|
| 245 | - |
|
| 246 | - if ($is_known_host) { |
|
| 247 | - foreach ($known_hosts as $known_host) { |
|
| 248 | - $parse_known = parse_url($known_host); |
|
| 249 | - if ( |
|
| 250 | - $parse_known |
|
| 251 | - and !empty($parse_known['port']) |
|
| 252 | - and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 253 | - and $parse_known['port'] == $port |
|
| 254 | - ) { |
|
| 255 | - return $url; |
|
| 256 | - } |
|
| 257 | - } |
|
| 258 | - } |
|
| 259 | - |
|
| 260 | - return false; |
|
| 168 | + if (!function_exists('protocole_verifier')) { |
|
| 169 | + include_spip('inc/filtres_mini'); |
|
| 170 | + } |
|
| 171 | + |
|
| 172 | + if (!protocole_verifier($url, ['http', 'https'])) { |
|
| 173 | + return false; |
|
| 174 | + } |
|
| 175 | + |
|
| 176 | + $parsed_url = parse_url($url); |
|
| 177 | + if (!$parsed_url or empty($parsed_url['host'])) { |
|
| 178 | + return false; |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + if (isset($parsed_url['user']) or isset($parsed_url['pass'])) { |
|
| 182 | + return false; |
|
| 183 | + } |
|
| 184 | + |
|
| 185 | + if (false !== strpbrk($parsed_url['host'], ':#?[]')) { |
|
| 186 | + return false; |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + if (!is_array($known_hosts)) { |
|
| 190 | + $known_hosts = [$known_hosts]; |
|
| 191 | + } |
|
| 192 | + $known_hosts[] = $GLOBALS['meta']['adresse_site']; |
|
| 193 | + $known_hosts[] = url_de_base(); |
|
| 194 | + $known_hosts = pipeline('declarer_hosts_distants', $known_hosts); |
|
| 195 | + |
|
| 196 | + $is_known_host = false; |
|
| 197 | + foreach ($known_hosts as $known_host) { |
|
| 198 | + $parse_known = parse_url($known_host); |
|
| 199 | + if ( |
|
| 200 | + $parse_known |
|
| 201 | + and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 202 | + ) { |
|
| 203 | + $is_known_host = true; |
|
| 204 | + break; |
|
| 205 | + } |
|
| 206 | + } |
|
| 207 | + |
|
| 208 | + if (!$is_known_host) { |
|
| 209 | + $host = trim($parsed_url['host'], '.'); |
|
| 210 | + if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 211 | + $ip = gethostbyname($host); |
|
| 212 | + if ($ip === $host) { |
|
| 213 | + // Error condition for gethostbyname() |
|
| 214 | + $ip = false; |
|
| 215 | + } |
|
| 216 | + if ($records = dns_get_record($host)) { |
|
| 217 | + foreach ($records as $record) { |
|
| 218 | + // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit |
|
| 219 | + // se fasse sur la meme IP |
|
| 220 | + if ($record['ttl'] < 10) { |
|
| 221 | + $ip = false; |
|
| 222 | + break; |
|
| 223 | + } |
|
| 224 | + } |
|
| 225 | + } |
|
| 226 | + else { |
|
| 227 | + $ip = false; |
|
| 228 | + } |
|
| 229 | + } |
|
| 230 | + if ($ip) { |
|
| 231 | + if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 232 | + return false; |
|
| 233 | + } |
|
| 234 | + } |
|
| 235 | + } |
|
| 236 | + |
|
| 237 | + if (empty($parsed_url['port'])) { |
|
| 238 | + return $url; |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + $port = $parsed_url['port']; |
|
| 242 | + if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 243 | + return $url; |
|
| 244 | + } |
|
| 245 | + |
|
| 246 | + if ($is_known_host) { |
|
| 247 | + foreach ($known_hosts as $known_host) { |
|
| 248 | + $parse_known = parse_url($known_host); |
|
| 249 | + if ( |
|
| 250 | + $parse_known |
|
| 251 | + and !empty($parse_known['port']) |
|
| 252 | + and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 253 | + and $parse_known['port'] == $port |
|
| 254 | + ) { |
|
| 255 | + return $url; |
|
| 256 | + } |
|
| 257 | + } |
|
| 258 | + } |
|
| 259 | + |
|
| 260 | + return false; |
|
| 261 | 261 | } |
| 262 | 262 | |
| 263 | 263 | /** |
@@ -277,86 +277,86 @@ discard block |
||
| 277 | 277 | */ |
| 278 | 278 | function prepare_donnees_post($donnees, $boundary = '') { |
| 279 | 279 | |
| 280 | - // permettre a la fonction qui a demande le post de formater elle meme ses donnees |
|
| 281 | - // pour un appel soap par exemple |
|
| 282 | - // l'entete est separe des donnees par un double retour a la ligne |
|
| 283 | - // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n |
|
| 284 | - if (is_string($donnees) && strlen($donnees)) { |
|
| 285 | - $entete = ''; |
|
| 286 | - // on repasse tous les \r\n et \r en simples \n |
|
| 287 | - $donnees = str_replace("\r\n", "\n", $donnees); |
|
| 288 | - $donnees = str_replace("\r", "\n", $donnees); |
|
| 289 | - // un double retour a la ligne signifie la fin de l'entete et le debut des donnees |
|
| 290 | - $p = strpos($donnees, "\n\n"); |
|
| 291 | - if ($p !== false) { |
|
| 292 | - $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1)); |
|
| 293 | - $donnees = substr($donnees, $p + 2); |
|
| 294 | - } |
|
| 295 | - $chaine = str_replace("\n", "\r\n", $donnees); |
|
| 296 | - } else { |
|
| 297 | - /* boundary automatique */ |
|
| 298 | - // Si on a plus de 500 octects de donnees, on "boundarise" |
|
| 299 | - if ($boundary === '') { |
|
| 300 | - $taille = 0; |
|
| 301 | - foreach ($donnees as $cle => $valeur) { |
|
| 302 | - if (is_array($valeur)) { |
|
| 303 | - foreach ($valeur as $val2) { |
|
| 304 | - $taille += strlen($val2); |
|
| 305 | - } |
|
| 306 | - } else { |
|
| 307 | - // faut-il utiliser spip_strlen() dans inc/charsets ? |
|
| 308 | - $taille += strlen($valeur); |
|
| 309 | - } |
|
| 310 | - } |
|
| 311 | - if ($taille > 500) { |
|
| 312 | - $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - if (is_string($boundary) and strlen($boundary)) { |
|
| 317 | - // fabrique une chaine HTTP pour un POST avec boundary |
|
| 318 | - $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n"; |
|
| 319 | - $chaine = ''; |
|
| 320 | - if (is_array($donnees)) { |
|
| 321 | - foreach ($donnees as $cle => $valeur) { |
|
| 322 | - if (is_array($valeur)) { |
|
| 323 | - foreach ($valeur as $val2) { |
|
| 324 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 325 | - $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n"; |
|
| 326 | - $chaine .= "\r\n"; |
|
| 327 | - $chaine .= $val2; |
|
| 328 | - } |
|
| 329 | - } else { |
|
| 330 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 331 | - $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n"; |
|
| 332 | - $chaine .= "\r\n"; |
|
| 333 | - $chaine .= $valeur; |
|
| 334 | - } |
|
| 335 | - } |
|
| 336 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 337 | - } |
|
| 338 | - } else { |
|
| 339 | - // fabrique une chaine HTTP simple pour un POST |
|
| 340 | - $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 341 | - $chaine = []; |
|
| 342 | - if (is_array($donnees)) { |
|
| 343 | - foreach ($donnees as $cle => $valeur) { |
|
| 344 | - if (is_array($valeur)) { |
|
| 345 | - foreach ($valeur as $val2) { |
|
| 346 | - $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 347 | - } |
|
| 348 | - } else { |
|
| 349 | - $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 350 | - } |
|
| 351 | - } |
|
| 352 | - $chaine = implode('&', $chaine); |
|
| 353 | - } else { |
|
| 354 | - $chaine = $donnees; |
|
| 355 | - } |
|
| 356 | - } |
|
| 357 | - } |
|
| 358 | - |
|
| 359 | - return [$entete, $chaine]; |
|
| 280 | + // permettre a la fonction qui a demande le post de formater elle meme ses donnees |
|
| 281 | + // pour un appel soap par exemple |
|
| 282 | + // l'entete est separe des donnees par un double retour a la ligne |
|
| 283 | + // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n |
|
| 284 | + if (is_string($donnees) && strlen($donnees)) { |
|
| 285 | + $entete = ''; |
|
| 286 | + // on repasse tous les \r\n et \r en simples \n |
|
| 287 | + $donnees = str_replace("\r\n", "\n", $donnees); |
|
| 288 | + $donnees = str_replace("\r", "\n", $donnees); |
|
| 289 | + // un double retour a la ligne signifie la fin de l'entete et le debut des donnees |
|
| 290 | + $p = strpos($donnees, "\n\n"); |
|
| 291 | + if ($p !== false) { |
|
| 292 | + $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1)); |
|
| 293 | + $donnees = substr($donnees, $p + 2); |
|
| 294 | + } |
|
| 295 | + $chaine = str_replace("\n", "\r\n", $donnees); |
|
| 296 | + } else { |
|
| 297 | + /* boundary automatique */ |
|
| 298 | + // Si on a plus de 500 octects de donnees, on "boundarise" |
|
| 299 | + if ($boundary === '') { |
|
| 300 | + $taille = 0; |
|
| 301 | + foreach ($donnees as $cle => $valeur) { |
|
| 302 | + if (is_array($valeur)) { |
|
| 303 | + foreach ($valeur as $val2) { |
|
| 304 | + $taille += strlen($val2); |
|
| 305 | + } |
|
| 306 | + } else { |
|
| 307 | + // faut-il utiliser spip_strlen() dans inc/charsets ? |
|
| 308 | + $taille += strlen($valeur); |
|
| 309 | + } |
|
| 310 | + } |
|
| 311 | + if ($taille > 500) { |
|
| 312 | + $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + if (is_string($boundary) and strlen($boundary)) { |
|
| 317 | + // fabrique une chaine HTTP pour un POST avec boundary |
|
| 318 | + $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n"; |
|
| 319 | + $chaine = ''; |
|
| 320 | + if (is_array($donnees)) { |
|
| 321 | + foreach ($donnees as $cle => $valeur) { |
|
| 322 | + if (is_array($valeur)) { |
|
| 323 | + foreach ($valeur as $val2) { |
|
| 324 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 325 | + $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n"; |
|
| 326 | + $chaine .= "\r\n"; |
|
| 327 | + $chaine .= $val2; |
|
| 328 | + } |
|
| 329 | + } else { |
|
| 330 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 331 | + $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n"; |
|
| 332 | + $chaine .= "\r\n"; |
|
| 333 | + $chaine .= $valeur; |
|
| 334 | + } |
|
| 335 | + } |
|
| 336 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 337 | + } |
|
| 338 | + } else { |
|
| 339 | + // fabrique une chaine HTTP simple pour un POST |
|
| 340 | + $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 341 | + $chaine = []; |
|
| 342 | + if (is_array($donnees)) { |
|
| 343 | + foreach ($donnees as $cle => $valeur) { |
|
| 344 | + if (is_array($valeur)) { |
|
| 345 | + foreach ($valeur as $val2) { |
|
| 346 | + $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 347 | + } |
|
| 348 | + } else { |
|
| 349 | + $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 350 | + } |
|
| 351 | + } |
|
| 352 | + $chaine = implode('&', $chaine); |
|
| 353 | + } else { |
|
| 354 | + $chaine = $donnees; |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | + } |
|
| 358 | + |
|
| 359 | + return [$entete, $chaine]; |
|
| 360 | 360 | } |
| 361 | 361 | |
| 362 | 362 | /** |
@@ -370,20 +370,20 @@ discard block |
||
| 370 | 370 | */ |
| 371 | 371 | function url_to_ascii($url_idn) { |
| 372 | 372 | |
| 373 | - if ($parts = parse_url($url_idn)) { |
|
| 374 | - $host = $parts['host']; |
|
| 375 | - if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) { |
|
| 376 | - include_spip('inc/idna_convert.class'); |
|
| 377 | - $IDN = new idna_convert(); |
|
| 378 | - $host_ascii = $IDN->encode($host); |
|
| 379 | - $url_idn = explode($host, $url_idn, 2); |
|
| 380 | - $url_idn = implode($host_ascii, $url_idn); |
|
| 381 | - } |
|
| 382 | - // et on urlencode les char utf si besoin dans le path |
|
| 383 | - $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn); |
|
| 384 | - } |
|
| 385 | - |
|
| 386 | - return $url_idn; |
|
| 373 | + if ($parts = parse_url($url_idn)) { |
|
| 374 | + $host = $parts['host']; |
|
| 375 | + if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) { |
|
| 376 | + include_spip('inc/idna_convert.class'); |
|
| 377 | + $IDN = new idna_convert(); |
|
| 378 | + $host_ascii = $IDN->encode($host); |
|
| 379 | + $url_idn = explode($host, $url_idn, 2); |
|
| 380 | + $url_idn = implode($host_ascii, $url_idn); |
|
| 381 | + } |
|
| 382 | + // et on urlencode les char utf si besoin dans le path |
|
| 383 | + $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn); |
|
| 384 | + } |
|
| 385 | + |
|
| 386 | + return $url_idn; |
|
| 387 | 387 | } |
| 388 | 388 | |
| 389 | 389 | /** |
@@ -424,209 +424,209 @@ discard block |
||
| 424 | 424 | * string file : nom du fichier si enregistre dans un fichier |
| 425 | 425 | */ |
| 426 | 426 | function recuperer_url($url, $options = []) { |
| 427 | - // Conserve la mémoire de la méthode fournit éventuellement |
|
| 428 | - $methode_demandee = $options['methode'] ?? ''; |
|
| 429 | - $default = [ |
|
| 430 | - 'transcoder' => false, |
|
| 431 | - 'methode' => 'GET', |
|
| 432 | - 'taille_max' => null, |
|
| 433 | - 'headers' => [], |
|
| 434 | - 'datas' => '', |
|
| 435 | - 'boundary' => '', |
|
| 436 | - 'refuser_gz' => false, |
|
| 437 | - 'if_modified_since' => '', |
|
| 438 | - 'uri_referer' => '', |
|
| 439 | - 'file' => '', |
|
| 440 | - 'follow_location' => 10, |
|
| 441 | - 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 442 | - ]; |
|
| 443 | - $options = array_merge($default, $options); |
|
| 444 | - // copier directement dans un fichier ? |
|
| 445 | - $copy = $options['file']; |
|
| 446 | - |
|
| 447 | - if ($options['methode'] == 'HEAD') { |
|
| 448 | - $options['taille_max'] = 0; |
|
| 449 | - } |
|
| 450 | - if (is_null($options['taille_max'])) { |
|
| 451 | - $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
|
| 452 | - } |
|
| 453 | - |
|
| 454 | - spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 455 | - |
|
| 456 | - // Ajout des en-têtes spécifiques si besoin |
|
| 457 | - $formatted_data = ''; |
|
| 458 | - if (!empty($options['headers'])) { |
|
| 459 | - foreach ($options['headers'] as $champ => $valeur) { |
|
| 460 | - $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 461 | - } |
|
| 462 | - } |
|
| 463 | - |
|
| 464 | - if (!empty($options['datas'])) { |
|
| 465 | - [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
|
| 466 | - $head .= $formatted_data; |
|
| 467 | - if (stripos($head, 'Content-Length:') === false) { |
|
| 468 | - $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 469 | - } |
|
| 470 | - $formatted_data = $head . "\r\n" . $postdata; |
|
| 471 | - if ( |
|
| 472 | - strlen($postdata) |
|
| 473 | - and !$methode_demandee |
|
| 474 | - ) { |
|
| 475 | - $options['methode'] = 'POST'; |
|
| 476 | - } |
|
| 477 | - } elseif ($formatted_data) { |
|
| 478 | - $formatted_data .= "\r\n"; |
|
| 479 | - } |
|
| 480 | - |
|
| 481 | - // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
|
| 482 | - $url = preg_replace(',^feed://,i', 'http://', $url); |
|
| 483 | - if (!tester_url_absolue($url)) { |
|
| 484 | - $url = 'http://' . $url; |
|
| 485 | - } elseif (strncmp($url, '//', 2) == 0) { |
|
| 486 | - $url = 'http:' . $url; |
|
| 487 | - } |
|
| 488 | - |
|
| 489 | - $url = url_to_ascii($url); |
|
| 490 | - |
|
| 491 | - $result = [ |
|
| 492 | - 'status' => 0, |
|
| 493 | - 'headers' => '', |
|
| 494 | - 'page' => '', |
|
| 495 | - 'length' => 0, |
|
| 496 | - 'last_modified' => '', |
|
| 497 | - 'location' => '', |
|
| 498 | - 'url' => $url |
|
| 499 | - ]; |
|
| 500 | - |
|
| 501 | - // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz |
|
| 502 | - $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false); |
|
| 503 | - |
|
| 504 | - // ouvrir la connexion et envoyer la requete et ses en-tetes |
|
| 505 | - [$handle, $fopen] = init_http( |
|
| 506 | - $options['methode'], |
|
| 507 | - $url, |
|
| 508 | - $refuser_gz, |
|
| 509 | - $options['uri_referer'], |
|
| 510 | - $formatted_data, |
|
| 511 | - $options['version_http'], |
|
| 512 | - $options['if_modified_since'] |
|
| 513 | - ); |
|
| 514 | - if (!$handle) { |
|
| 515 | - spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 516 | - |
|
| 517 | - return false; |
|
| 518 | - } |
|
| 519 | - |
|
| 520 | - // Sauf en fopen, envoyer le flux d'entree |
|
| 521 | - // et recuperer les en-tetes de reponses |
|
| 522 | - if (!$fopen) { |
|
| 523 | - $res = recuperer_entetes_complets($handle, $options['if_modified_since']); |
|
| 524 | - if (!$res) { |
|
| 525 | - fclose($handle); |
|
| 526 | - $t = @parse_url($url); |
|
| 527 | - $host = $t['host']; |
|
| 528 | - // Chinoisierie inexplicable pour contrer |
|
| 529 | - // les actions liberticides de l'empire du milieu |
|
| 530 | - if ( |
|
| 531 | - !need_proxy($host) |
|
| 532 | - and $res = @file_get_contents($url) |
|
| 533 | - ) { |
|
| 534 | - $result['length'] = strlen($res); |
|
| 535 | - if ($copy) { |
|
| 536 | - ecrire_fichier($copy, $res); |
|
| 537 | - $result['file'] = $copy; |
|
| 538 | - } else { |
|
| 539 | - $result['page'] = $res; |
|
| 540 | - } |
|
| 541 | - $res = [ |
|
| 542 | - 'status' => 200, |
|
| 543 | - ]; |
|
| 544 | - } else { |
|
| 545 | - spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 546 | - return false; |
|
| 547 | - } |
|
| 548 | - } elseif ($res['location'] and $options['follow_location']) { |
|
| 549 | - $options['follow_location']--; |
|
| 550 | - fclose($handle); |
|
| 551 | - include_spip('inc/filtres'); |
|
| 552 | - $url = suivre_lien($url, $res['location']); |
|
| 553 | - |
|
| 554 | - // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode |
|
| 555 | - if ($options['methode'] !== 'GET') { |
|
| 556 | - if (empty($res['status']) or !in_array($res['status'], [307, 308])) { |
|
| 557 | - $options['methode'] = 'GET'; |
|
| 558 | - $options['datas'] = ''; |
|
| 559 | - } |
|
| 560 | - } |
|
| 561 | - spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 562 | - |
|
| 563 | - return recuperer_url($url, $options); |
|
| 564 | - } elseif ($res['status'] !== 200) { |
|
| 565 | - spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 566 | - } |
|
| 567 | - $result['status'] = $res['status']; |
|
| 568 | - if (isset($res['headers'])) { |
|
| 569 | - $result['headers'] = $res['headers']; |
|
| 570 | - } |
|
| 571 | - if (isset($res['last_modified'])) { |
|
| 572 | - $result['last_modified'] = $res['last_modified']; |
|
| 573 | - } |
|
| 574 | - if (isset($res['location'])) { |
|
| 575 | - $result['location'] = $res['location']; |
|
| 576 | - } |
|
| 577 | - } |
|
| 578 | - |
|
| 579 | - // on ne veut que les entetes |
|
| 580 | - if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
|
| 581 | - spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 582 | - return $result; |
|
| 583 | - } |
|
| 584 | - |
|
| 585 | - |
|
| 586 | - // s'il faut deballer, le faire via un fichier temporaire |
|
| 587 | - // sinon la memoire explose pour les gros flux |
|
| 588 | - |
|
| 589 | - $gz = false; |
|
| 590 | - if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
|
| 591 | - $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 592 | - } |
|
| 593 | - |
|
| 594 | - // si on a pas deja recuperer le contenu par une methode detournee |
|
| 595 | - if (!$result['length']) { |
|
| 596 | - $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy); |
|
| 597 | - fclose($handle); |
|
| 598 | - if ($copy) { |
|
| 599 | - $result['length'] = $res; |
|
| 600 | - $result['file'] = $copy; |
|
| 601 | - } elseif ($res) { |
|
| 602 | - $result['page'] = &$res; |
|
| 603 | - $result['length'] = strlen($result['page']); |
|
| 604 | - } |
|
| 605 | - if (!$result['status']) { |
|
| 606 | - $result['status'] = 200; // on a reussi, donc ! |
|
| 607 | - } |
|
| 608 | - } |
|
| 609 | - if (!$result['page']) { |
|
| 610 | - return $result; |
|
| 611 | - } |
|
| 612 | - |
|
| 613 | - // Decompresser au besoin |
|
| 614 | - if ($gz) { |
|
| 615 | - $result['page'] = implode('', gzfile($gz)); |
|
| 616 | - supprimer_fichier($gz); |
|
| 617 | - } |
|
| 618 | - |
|
| 619 | - // Faut-il l'importer dans notre charset local ? |
|
| 620 | - if ($options['transcoder']) { |
|
| 621 | - include_spip('inc/charsets'); |
|
| 622 | - $result['page'] = transcoder_page($result['page'], $result['headers']); |
|
| 623 | - } |
|
| 624 | - |
|
| 625 | - $trace = json_decode(json_encode($result), true); |
|
| 626 | - $trace['page'] = '...'; |
|
| 627 | - spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 628 | - |
|
| 629 | - return $result; |
|
| 427 | + // Conserve la mémoire de la méthode fournit éventuellement |
|
| 428 | + $methode_demandee = $options['methode'] ?? ''; |
|
| 429 | + $default = [ |
|
| 430 | + 'transcoder' => false, |
|
| 431 | + 'methode' => 'GET', |
|
| 432 | + 'taille_max' => null, |
|
| 433 | + 'headers' => [], |
|
| 434 | + 'datas' => '', |
|
| 435 | + 'boundary' => '', |
|
| 436 | + 'refuser_gz' => false, |
|
| 437 | + 'if_modified_since' => '', |
|
| 438 | + 'uri_referer' => '', |
|
| 439 | + 'file' => '', |
|
| 440 | + 'follow_location' => 10, |
|
| 441 | + 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 442 | + ]; |
|
| 443 | + $options = array_merge($default, $options); |
|
| 444 | + // copier directement dans un fichier ? |
|
| 445 | + $copy = $options['file']; |
|
| 446 | + |
|
| 447 | + if ($options['methode'] == 'HEAD') { |
|
| 448 | + $options['taille_max'] = 0; |
|
| 449 | + } |
|
| 450 | + if (is_null($options['taille_max'])) { |
|
| 451 | + $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
|
| 452 | + } |
|
| 453 | + |
|
| 454 | + spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 455 | + |
|
| 456 | + // Ajout des en-têtes spécifiques si besoin |
|
| 457 | + $formatted_data = ''; |
|
| 458 | + if (!empty($options['headers'])) { |
|
| 459 | + foreach ($options['headers'] as $champ => $valeur) { |
|
| 460 | + $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 461 | + } |
|
| 462 | + } |
|
| 463 | + |
|
| 464 | + if (!empty($options['datas'])) { |
|
| 465 | + [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
|
| 466 | + $head .= $formatted_data; |
|
| 467 | + if (stripos($head, 'Content-Length:') === false) { |
|
| 468 | + $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 469 | + } |
|
| 470 | + $formatted_data = $head . "\r\n" . $postdata; |
|
| 471 | + if ( |
|
| 472 | + strlen($postdata) |
|
| 473 | + and !$methode_demandee |
|
| 474 | + ) { |
|
| 475 | + $options['methode'] = 'POST'; |
|
| 476 | + } |
|
| 477 | + } elseif ($formatted_data) { |
|
| 478 | + $formatted_data .= "\r\n"; |
|
| 479 | + } |
|
| 480 | + |
|
| 481 | + // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
|
| 482 | + $url = preg_replace(',^feed://,i', 'http://', $url); |
|
| 483 | + if (!tester_url_absolue($url)) { |
|
| 484 | + $url = 'http://' . $url; |
|
| 485 | + } elseif (strncmp($url, '//', 2) == 0) { |
|
| 486 | + $url = 'http:' . $url; |
|
| 487 | + } |
|
| 488 | + |
|
| 489 | + $url = url_to_ascii($url); |
|
| 490 | + |
|
| 491 | + $result = [ |
|
| 492 | + 'status' => 0, |
|
| 493 | + 'headers' => '', |
|
| 494 | + 'page' => '', |
|
| 495 | + 'length' => 0, |
|
| 496 | + 'last_modified' => '', |
|
| 497 | + 'location' => '', |
|
| 498 | + 'url' => $url |
|
| 499 | + ]; |
|
| 500 | + |
|
| 501 | + // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz |
|
| 502 | + $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false); |
|
| 503 | + |
|
| 504 | + // ouvrir la connexion et envoyer la requete et ses en-tetes |
|
| 505 | + [$handle, $fopen] = init_http( |
|
| 506 | + $options['methode'], |
|
| 507 | + $url, |
|
| 508 | + $refuser_gz, |
|
| 509 | + $options['uri_referer'], |
|
| 510 | + $formatted_data, |
|
| 511 | + $options['version_http'], |
|
| 512 | + $options['if_modified_since'] |
|
| 513 | + ); |
|
| 514 | + if (!$handle) { |
|
| 515 | + spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 516 | + |
|
| 517 | + return false; |
|
| 518 | + } |
|
| 519 | + |
|
| 520 | + // Sauf en fopen, envoyer le flux d'entree |
|
| 521 | + // et recuperer les en-tetes de reponses |
|
| 522 | + if (!$fopen) { |
|
| 523 | + $res = recuperer_entetes_complets($handle, $options['if_modified_since']); |
|
| 524 | + if (!$res) { |
|
| 525 | + fclose($handle); |
|
| 526 | + $t = @parse_url($url); |
|
| 527 | + $host = $t['host']; |
|
| 528 | + // Chinoisierie inexplicable pour contrer |
|
| 529 | + // les actions liberticides de l'empire du milieu |
|
| 530 | + if ( |
|
| 531 | + !need_proxy($host) |
|
| 532 | + and $res = @file_get_contents($url) |
|
| 533 | + ) { |
|
| 534 | + $result['length'] = strlen($res); |
|
| 535 | + if ($copy) { |
|
| 536 | + ecrire_fichier($copy, $res); |
|
| 537 | + $result['file'] = $copy; |
|
| 538 | + } else { |
|
| 539 | + $result['page'] = $res; |
|
| 540 | + } |
|
| 541 | + $res = [ |
|
| 542 | + 'status' => 200, |
|
| 543 | + ]; |
|
| 544 | + } else { |
|
| 545 | + spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 546 | + return false; |
|
| 547 | + } |
|
| 548 | + } elseif ($res['location'] and $options['follow_location']) { |
|
| 549 | + $options['follow_location']--; |
|
| 550 | + fclose($handle); |
|
| 551 | + include_spip('inc/filtres'); |
|
| 552 | + $url = suivre_lien($url, $res['location']); |
|
| 553 | + |
|
| 554 | + // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode |
|
| 555 | + if ($options['methode'] !== 'GET') { |
|
| 556 | + if (empty($res['status']) or !in_array($res['status'], [307, 308])) { |
|
| 557 | + $options['methode'] = 'GET'; |
|
| 558 | + $options['datas'] = ''; |
|
| 559 | + } |
|
| 560 | + } |
|
| 561 | + spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 562 | + |
|
| 563 | + return recuperer_url($url, $options); |
|
| 564 | + } elseif ($res['status'] !== 200) { |
|
| 565 | + spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 566 | + } |
|
| 567 | + $result['status'] = $res['status']; |
|
| 568 | + if (isset($res['headers'])) { |
|
| 569 | + $result['headers'] = $res['headers']; |
|
| 570 | + } |
|
| 571 | + if (isset($res['last_modified'])) { |
|
| 572 | + $result['last_modified'] = $res['last_modified']; |
|
| 573 | + } |
|
| 574 | + if (isset($res['location'])) { |
|
| 575 | + $result['location'] = $res['location']; |
|
| 576 | + } |
|
| 577 | + } |
|
| 578 | + |
|
| 579 | + // on ne veut que les entetes |
|
| 580 | + if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
|
| 581 | + spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 582 | + return $result; |
|
| 583 | + } |
|
| 584 | + |
|
| 585 | + |
|
| 586 | + // s'il faut deballer, le faire via un fichier temporaire |
|
| 587 | + // sinon la memoire explose pour les gros flux |
|
| 588 | + |
|
| 589 | + $gz = false; |
|
| 590 | + if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
|
| 591 | + $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 592 | + } |
|
| 593 | + |
|
| 594 | + // si on a pas deja recuperer le contenu par une methode detournee |
|
| 595 | + if (!$result['length']) { |
|
| 596 | + $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy); |
|
| 597 | + fclose($handle); |
|
| 598 | + if ($copy) { |
|
| 599 | + $result['length'] = $res; |
|
| 600 | + $result['file'] = $copy; |
|
| 601 | + } elseif ($res) { |
|
| 602 | + $result['page'] = &$res; |
|
| 603 | + $result['length'] = strlen($result['page']); |
|
| 604 | + } |
|
| 605 | + if (!$result['status']) { |
|
| 606 | + $result['status'] = 200; // on a reussi, donc ! |
|
| 607 | + } |
|
| 608 | + } |
|
| 609 | + if (!$result['page']) { |
|
| 610 | + return $result; |
|
| 611 | + } |
|
| 612 | + |
|
| 613 | + // Decompresser au besoin |
|
| 614 | + if ($gz) { |
|
| 615 | + $result['page'] = implode('', gzfile($gz)); |
|
| 616 | + supprimer_fichier($gz); |
|
| 617 | + } |
|
| 618 | + |
|
| 619 | + // Faut-il l'importer dans notre charset local ? |
|
| 620 | + if ($options['transcoder']) { |
|
| 621 | + include_spip('inc/charsets'); |
|
| 622 | + $result['page'] = transcoder_page($result['page'], $result['headers']); |
|
| 623 | + } |
|
| 624 | + |
|
| 625 | + $trace = json_decode(json_encode($result), true); |
|
| 626 | + $trace['page'] = '...'; |
|
| 627 | + spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 628 | + |
|
| 629 | + return $result; |
|
| 630 | 630 | } |
| 631 | 631 | |
| 632 | 632 | /** |
@@ -642,73 +642,73 @@ discard block |
||
| 642 | 642 | * @return array|bool|mixed |
| 643 | 643 | */ |
| 644 | 644 | function recuperer_url_cache($url, $options = []) { |
| 645 | - if (!defined('_DELAI_RECUPERER_URL_CACHE')) { |
|
| 646 | - define('_DELAI_RECUPERER_URL_CACHE', 3600); |
|
| 647 | - } |
|
| 648 | - $default = [ |
|
| 649 | - 'transcoder' => false, |
|
| 650 | - 'methode' => 'GET', |
|
| 651 | - 'taille_max' => null, |
|
| 652 | - 'datas' => '', |
|
| 653 | - 'boundary' => '', |
|
| 654 | - 'refuser_gz' => false, |
|
| 655 | - 'if_modified_since' => '', |
|
| 656 | - 'uri_referer' => '', |
|
| 657 | - 'file' => '', |
|
| 658 | - 'follow_location' => 10, |
|
| 659 | - 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 660 | - 'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE, |
|
| 661 | - ]; |
|
| 662 | - $options = array_merge($default, $options); |
|
| 663 | - |
|
| 664 | - // cas ou il n'est pas possible de cacher |
|
| 665 | - if (!empty($options['data']) or $options['methode'] == 'POST') { |
|
| 666 | - return recuperer_url($url, $options); |
|
| 667 | - } |
|
| 668 | - |
|
| 669 | - // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc) |
|
| 670 | - static $errors = []; |
|
| 671 | - if (isset($errors[$url])) { |
|
| 672 | - return $errors[$url]; |
|
| 673 | - } |
|
| 674 | - |
|
| 675 | - $sig = $options; |
|
| 676 | - unset($sig['if_modified_since']); |
|
| 677 | - unset($sig['delai_cache']); |
|
| 678 | - $sig['url'] = $url; |
|
| 679 | - |
|
| 680 | - $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
|
| 681 | - $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 682 | - $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
|
| 683 | - $cache = "$sub$cache"; |
|
| 684 | - |
|
| 685 | - $res = false; |
|
| 686 | - $is_cached = file_exists($cache); |
|
| 687 | - if ( |
|
| 688 | - $is_cached |
|
| 689 | - and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache']) |
|
| 690 | - ) { |
|
| 691 | - lire_fichier($cache, $res); |
|
| 692 | - if ($res = unserialize($res)) { |
|
| 693 | - // mettre le last_modified et le status=304 ? |
|
| 694 | - } |
|
| 695 | - } |
|
| 696 | - if (!$res) { |
|
| 697 | - $res = recuperer_url($url, $options); |
|
| 698 | - // ne pas recharger cette url non cachee dans le meme hit puisque non disponible |
|
| 699 | - if (!$res) { |
|
| 700 | - if ($is_cached) { |
|
| 701 | - // on a pas reussi a recuperer mais on avait un cache : l'utiliser |
|
| 702 | - lire_fichier($cache, $res); |
|
| 703 | - $res = unserialize($res); |
|
| 704 | - } |
|
| 705 | - |
|
| 706 | - return $errors[$url] = $res; |
|
| 707 | - } |
|
| 708 | - ecrire_fichier($cache, serialize($res)); |
|
| 709 | - } |
|
| 710 | - |
|
| 711 | - return $res; |
|
| 645 | + if (!defined('_DELAI_RECUPERER_URL_CACHE')) { |
|
| 646 | + define('_DELAI_RECUPERER_URL_CACHE', 3600); |
|
| 647 | + } |
|
| 648 | + $default = [ |
|
| 649 | + 'transcoder' => false, |
|
| 650 | + 'methode' => 'GET', |
|
| 651 | + 'taille_max' => null, |
|
| 652 | + 'datas' => '', |
|
| 653 | + 'boundary' => '', |
|
| 654 | + 'refuser_gz' => false, |
|
| 655 | + 'if_modified_since' => '', |
|
| 656 | + 'uri_referer' => '', |
|
| 657 | + 'file' => '', |
|
| 658 | + 'follow_location' => 10, |
|
| 659 | + 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 660 | + 'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE, |
|
| 661 | + ]; |
|
| 662 | + $options = array_merge($default, $options); |
|
| 663 | + |
|
| 664 | + // cas ou il n'est pas possible de cacher |
|
| 665 | + if (!empty($options['data']) or $options['methode'] == 'POST') { |
|
| 666 | + return recuperer_url($url, $options); |
|
| 667 | + } |
|
| 668 | + |
|
| 669 | + // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc) |
|
| 670 | + static $errors = []; |
|
| 671 | + if (isset($errors[$url])) { |
|
| 672 | + return $errors[$url]; |
|
| 673 | + } |
|
| 674 | + |
|
| 675 | + $sig = $options; |
|
| 676 | + unset($sig['if_modified_since']); |
|
| 677 | + unset($sig['delai_cache']); |
|
| 678 | + $sig['url'] = $url; |
|
| 679 | + |
|
| 680 | + $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
|
| 681 | + $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 682 | + $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
|
| 683 | + $cache = "$sub$cache"; |
|
| 684 | + |
|
| 685 | + $res = false; |
|
| 686 | + $is_cached = file_exists($cache); |
|
| 687 | + if ( |
|
| 688 | + $is_cached |
|
| 689 | + and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache']) |
|
| 690 | + ) { |
|
| 691 | + lire_fichier($cache, $res); |
|
| 692 | + if ($res = unserialize($res)) { |
|
| 693 | + // mettre le last_modified et le status=304 ? |
|
| 694 | + } |
|
| 695 | + } |
|
| 696 | + if (!$res) { |
|
| 697 | + $res = recuperer_url($url, $options); |
|
| 698 | + // ne pas recharger cette url non cachee dans le meme hit puisque non disponible |
|
| 699 | + if (!$res) { |
|
| 700 | + if ($is_cached) { |
|
| 701 | + // on a pas reussi a recuperer mais on avait un cache : l'utiliser |
|
| 702 | + lire_fichier($cache, $res); |
|
| 703 | + $res = unserialize($res); |
|
| 704 | + } |
|
| 705 | + |
|
| 706 | + return $errors[$url] = $res; |
|
| 707 | + } |
|
| 708 | + ecrire_fichier($cache, serialize($res)); |
|
| 709 | + } |
|
| 710 | + |
|
| 711 | + return $res; |
|
| 712 | 712 | } |
| 713 | 713 | |
| 714 | 714 | /** |
@@ -726,42 +726,42 @@ discard block |
||
| 726 | 726 | * string contenu de la resource |
| 727 | 727 | */ |
| 728 | 728 | function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') { |
| 729 | - $tmpfile = null; |
|
| 730 | - $taille = 0; |
|
| 731 | - $result = ''; |
|
| 732 | - $fp = false; |
|
| 733 | - if ($fichier) { |
|
| 734 | - include_spip('inc/acces'); |
|
| 735 | - $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 736 | - $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
|
| 737 | - if (!$fp and file_exists($fichier)) { |
|
| 738 | - return filesize($fichier); |
|
| 739 | - } |
|
| 740 | - if (!$fp) { |
|
| 741 | - return false; |
|
| 742 | - } |
|
| 743 | - $result = 0; // on renvoie la taille du fichier |
|
| 744 | - } |
|
| 745 | - while (!feof($handle) and $taille < $taille_max) { |
|
| 746 | - $res = fread($handle, 16384); |
|
| 747 | - $taille += strlen($res); |
|
| 748 | - if ($fp) { |
|
| 749 | - fwrite($fp, $res); |
|
| 750 | - $result = $taille; |
|
| 751 | - } else { |
|
| 752 | - $result .= $res; |
|
| 753 | - } |
|
| 754 | - } |
|
| 755 | - if ($fp) { |
|
| 756 | - spip_fclose_unlock($fp); |
|
| 757 | - spip_unlink($fichier); |
|
| 758 | - @rename($tmpfile, $fichier); |
|
| 759 | - if (!file_exists($fichier)) { |
|
| 760 | - return false; |
|
| 761 | - } |
|
| 762 | - } |
|
| 763 | - |
|
| 764 | - return $result; |
|
| 729 | + $tmpfile = null; |
|
| 730 | + $taille = 0; |
|
| 731 | + $result = ''; |
|
| 732 | + $fp = false; |
|
| 733 | + if ($fichier) { |
|
| 734 | + include_spip('inc/acces'); |
|
| 735 | + $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 736 | + $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
|
| 737 | + if (!$fp and file_exists($fichier)) { |
|
| 738 | + return filesize($fichier); |
|
| 739 | + } |
|
| 740 | + if (!$fp) { |
|
| 741 | + return false; |
|
| 742 | + } |
|
| 743 | + $result = 0; // on renvoie la taille du fichier |
|
| 744 | + } |
|
| 745 | + while (!feof($handle) and $taille < $taille_max) { |
|
| 746 | + $res = fread($handle, 16384); |
|
| 747 | + $taille += strlen($res); |
|
| 748 | + if ($fp) { |
|
| 749 | + fwrite($fp, $res); |
|
| 750 | + $result = $taille; |
|
| 751 | + } else { |
|
| 752 | + $result .= $res; |
|
| 753 | + } |
|
| 754 | + } |
|
| 755 | + if ($fp) { |
|
| 756 | + spip_fclose_unlock($fp); |
|
| 757 | + spip_unlink($fichier); |
|
| 758 | + @rename($tmpfile, $fichier); |
|
| 759 | + if (!file_exists($fichier)) { |
|
| 760 | + return false; |
|
| 761 | + } |
|
| 762 | + } |
|
| 763 | + |
|
| 764 | + return $result; |
|
| 765 | 765 | } |
| 766 | 766 | |
| 767 | 767 | /** |
@@ -783,35 +783,35 @@ discard block |
||
| 783 | 783 | * string location |
| 784 | 784 | */ |
| 785 | 785 | function recuperer_entetes_complets($handle, $if_modified_since = false) { |
| 786 | - $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => '']; |
|
| 787 | - |
|
| 788 | - $s = @trim(fgets($handle, 16384)); |
|
| 789 | - if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) { |
|
| 790 | - return false; |
|
| 791 | - } |
|
| 792 | - $result['status'] = intval($r[1]); |
|
| 793 | - while ($s = trim(fgets($handle, 16384))) { |
|
| 794 | - $result['headers'][] = $s . "\n"; |
|
| 795 | - preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
|
| 796 | - [, $d, $v] = $r; |
|
| 797 | - if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
|
| 798 | - $result['location'] = $v; |
|
| 799 | - } elseif ($d == 'Last-Modified') { |
|
| 800 | - $result['last_modified'] = strtotime($v); |
|
| 801 | - } |
|
| 802 | - } |
|
| 803 | - if ( |
|
| 804 | - $if_modified_since |
|
| 805 | - and $result['last_modified'] |
|
| 806 | - and $if_modified_since > $result['last_modified'] |
|
| 807 | - and $result['status'] == 200 |
|
| 808 | - ) { |
|
| 809 | - $result['status'] = 304; |
|
| 810 | - } |
|
| 811 | - |
|
| 812 | - $result['headers'] = implode('', $result['headers']); |
|
| 813 | - |
|
| 814 | - return $result; |
|
| 786 | + $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => '']; |
|
| 787 | + |
|
| 788 | + $s = @trim(fgets($handle, 16384)); |
|
| 789 | + if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) { |
|
| 790 | + return false; |
|
| 791 | + } |
|
| 792 | + $result['status'] = intval($r[1]); |
|
| 793 | + while ($s = trim(fgets($handle, 16384))) { |
|
| 794 | + $result['headers'][] = $s . "\n"; |
|
| 795 | + preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
|
| 796 | + [, $d, $v] = $r; |
|
| 797 | + if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
|
| 798 | + $result['location'] = $v; |
|
| 799 | + } elseif ($d == 'Last-Modified') { |
|
| 800 | + $result['last_modified'] = strtotime($v); |
|
| 801 | + } |
|
| 802 | + } |
|
| 803 | + if ( |
|
| 804 | + $if_modified_since |
|
| 805 | + and $result['last_modified'] |
|
| 806 | + and $if_modified_since > $result['last_modified'] |
|
| 807 | + and $result['status'] == 200 |
|
| 808 | + ) { |
|
| 809 | + $result['status'] = 304; |
|
| 810 | + } |
|
| 811 | + |
|
| 812 | + $result['headers'] = implode('', $result['headers']); |
|
| 813 | + |
|
| 814 | + return $result; |
|
| 815 | 815 | } |
| 816 | 816 | |
| 817 | 817 | /** |
@@ -833,22 +833,22 @@ discard block |
||
| 833 | 833 | * Nom du fichier pour copie locale |
| 834 | 834 | **/ |
| 835 | 835 | function nom_fichier_copie_locale($source, $extension) { |
| 836 | - include_spip('inc/documents'); |
|
| 836 | + include_spip('inc/documents'); |
|
| 837 | 837 | |
| 838 | - $d = creer_repertoire_documents('distant'); # IMG/distant/ |
|
| 839 | - $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ |
|
| 838 | + $d = creer_repertoire_documents('distant'); # IMG/distant/ |
|
| 839 | + $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ |
|
| 840 | 840 | |
| 841 | - // on se place tout le temps comme si on etait a la racine |
|
| 842 | - if (_DIR_RACINE) { |
|
| 843 | - $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 844 | - } |
|
| 841 | + // on se place tout le temps comme si on etait a la racine |
|
| 842 | + if (_DIR_RACINE) { |
|
| 843 | + $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 844 | + } |
|
| 845 | 845 | |
| 846 | - $m = md5($source); |
|
| 846 | + $m = md5($source); |
|
| 847 | 847 | |
| 848 | - return $d |
|
| 849 | - . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 850 | - . substr($m, 0, 4) |
|
| 851 | - . ".$extension"; |
|
| 848 | + return $d |
|
| 849 | + . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 850 | + . substr($m, 0, 4) |
|
| 851 | + . ".$extension"; |
|
| 852 | 852 | } |
| 853 | 853 | |
| 854 | 854 | /** |
@@ -866,70 +866,70 @@ discard block |
||
| 866 | 866 | * Nom du fichier calculé |
| 867 | 867 | **/ |
| 868 | 868 | function fichier_copie_locale($source) { |
| 869 | - // Si c'est deja local pas de souci |
|
| 870 | - if (!tester_url_absolue($source)) { |
|
| 871 | - if (_DIR_RACINE) { |
|
| 872 | - $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 873 | - } |
|
| 874 | - |
|
| 875 | - return $source; |
|
| 876 | - } |
|
| 877 | - |
|
| 878 | - // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier |
|
| 879 | - // a deja ete copie en local avec cette extension |
|
| 880 | - // dans ce cas elle est fiable, pas la peine de requeter en base |
|
| 881 | - $path_parts = pathinfo($source); |
|
| 882 | - if (!isset($path_parts['extension'])) { |
|
| 883 | - $path_parts['extension'] = ''; |
|
| 884 | - } |
|
| 885 | - $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 886 | - if ( |
|
| 887 | - $ext |
|
| 888 | - and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
|
| 889 | - and $f = nom_fichier_copie_locale($source, $ext) |
|
| 890 | - and file_exists(_DIR_RACINE . $f) |
|
| 891 | - ) { |
|
| 892 | - return $f; |
|
| 893 | - } |
|
| 894 | - |
|
| 895 | - |
|
| 896 | - // Si c'est deja dans la table des documents, |
|
| 897 | - // ramener le nom de sa copie potentielle |
|
| 898 | - $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 899 | - |
|
| 900 | - if ($ext) { |
|
| 901 | - return nom_fichier_copie_locale($source, $ext); |
|
| 902 | - } |
|
| 903 | - |
|
| 904 | - // voir si l'extension indiquee dans le nom du fichier est ok |
|
| 905 | - // et si il n'aurait pas deja ete rapatrie |
|
| 906 | - |
|
| 907 | - $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 908 | - |
|
| 909 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 910 | - $f = nom_fichier_copie_locale($source, $ext); |
|
| 911 | - if (file_exists(_DIR_RACINE . $f)) { |
|
| 912 | - return $f; |
|
| 913 | - } |
|
| 914 | - } |
|
| 915 | - |
|
| 916 | - // Ping pour voir si son extension est connue et autorisee |
|
| 917 | - // avec mise en cache du resultat du ping |
|
| 918 | - |
|
| 919 | - $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 920 | - if ( |
|
| 921 | - !@file_exists($cache) |
|
| 922 | - or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
|
| 923 | - or _request('var_mode') === 'recalcul' |
|
| 924 | - ) { |
|
| 925 | - $path_parts = recuperer_infos_distantes($source, 0, false); |
|
| 926 | - ecrire_fichier($cache, serialize($path_parts)); |
|
| 927 | - } |
|
| 928 | - $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
|
| 929 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 930 | - return nom_fichier_copie_locale($source, $ext); |
|
| 931 | - } |
|
| 932 | - spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 869 | + // Si c'est deja local pas de souci |
|
| 870 | + if (!tester_url_absolue($source)) { |
|
| 871 | + if (_DIR_RACINE) { |
|
| 872 | + $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 873 | + } |
|
| 874 | + |
|
| 875 | + return $source; |
|
| 876 | + } |
|
| 877 | + |
|
| 878 | + // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier |
|
| 879 | + // a deja ete copie en local avec cette extension |
|
| 880 | + // dans ce cas elle est fiable, pas la peine de requeter en base |
|
| 881 | + $path_parts = pathinfo($source); |
|
| 882 | + if (!isset($path_parts['extension'])) { |
|
| 883 | + $path_parts['extension'] = ''; |
|
| 884 | + } |
|
| 885 | + $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 886 | + if ( |
|
| 887 | + $ext |
|
| 888 | + and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
|
| 889 | + and $f = nom_fichier_copie_locale($source, $ext) |
|
| 890 | + and file_exists(_DIR_RACINE . $f) |
|
| 891 | + ) { |
|
| 892 | + return $f; |
|
| 893 | + } |
|
| 894 | + |
|
| 895 | + |
|
| 896 | + // Si c'est deja dans la table des documents, |
|
| 897 | + // ramener le nom de sa copie potentielle |
|
| 898 | + $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 899 | + |
|
| 900 | + if ($ext) { |
|
| 901 | + return nom_fichier_copie_locale($source, $ext); |
|
| 902 | + } |
|
| 903 | + |
|
| 904 | + // voir si l'extension indiquee dans le nom du fichier est ok |
|
| 905 | + // et si il n'aurait pas deja ete rapatrie |
|
| 906 | + |
|
| 907 | + $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 908 | + |
|
| 909 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 910 | + $f = nom_fichier_copie_locale($source, $ext); |
|
| 911 | + if (file_exists(_DIR_RACINE . $f)) { |
|
| 912 | + return $f; |
|
| 913 | + } |
|
| 914 | + } |
|
| 915 | + |
|
| 916 | + // Ping pour voir si son extension est connue et autorisee |
|
| 917 | + // avec mise en cache du resultat du ping |
|
| 918 | + |
|
| 919 | + $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 920 | + if ( |
|
| 921 | + !@file_exists($cache) |
|
| 922 | + or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
|
| 923 | + or _request('var_mode') === 'recalcul' |
|
| 924 | + ) { |
|
| 925 | + $path_parts = recuperer_infos_distantes($source, 0, false); |
|
| 926 | + ecrire_fichier($cache, serialize($path_parts)); |
|
| 927 | + } |
|
| 928 | + $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
|
| 929 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 930 | + return nom_fichier_copie_locale($source, $ext); |
|
| 931 | + } |
|
| 932 | + spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 933 | 933 | } |
| 934 | 934 | |
| 935 | 935 | |
@@ -957,97 +957,97 @@ discard block |
||
| 957 | 957 | **/ |
| 958 | 958 | function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true) { |
| 959 | 959 | |
| 960 | - // pas la peine de perdre son temps |
|
| 961 | - if (!tester_url_absolue($source)) { |
|
| 962 | - return false; |
|
| 963 | - } |
|
| 964 | - |
|
| 965 | - # charger les alias des types mime |
|
| 966 | - include_spip('base/typedoc'); |
|
| 967 | - |
|
| 968 | - $a = []; |
|
| 969 | - $mime_type = ''; |
|
| 970 | - // On va directement charger le debut des images et des fichiers html, |
|
| 971 | - // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si |
|
| 972 | - // ca echoue l'utilisateur devra les entrer... |
|
| 973 | - $reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]); |
|
| 974 | - $headers = $reponse['headers'] ?? ''; |
|
| 975 | - $a['body'] = $reponse['page'] ?? ''; |
|
| 976 | - if ($headers) { |
|
| 977 | - if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) { |
|
| 978 | - return false; |
|
| 979 | - } |
|
| 980 | - |
|
| 981 | - $a['extension'] = $extension; |
|
| 982 | - |
|
| 983 | - if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) { |
|
| 984 | - $a['taille'] = intval($regs[1]); |
|
| 985 | - } |
|
| 986 | - } |
|
| 987 | - |
|
| 988 | - // Echec avec HEAD, on tente avec GET |
|
| 989 | - if (!$a and !$max) { |
|
| 990 | - spip_log("tenter GET $source", 'distant'); |
|
| 991 | - $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); |
|
| 992 | - } |
|
| 993 | - |
|
| 994 | - // si on a rien trouve pas la peine d'insister |
|
| 995 | - if (!$a) { |
|
| 996 | - return false; |
|
| 997 | - } |
|
| 998 | - |
|
| 999 | - // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller |
|
| 1000 | - // recharger le document en GET et recuperer des donnees supplementaires... |
|
| 1001 | - include_spip('inc/filtres_images_lib_mini'); |
|
| 1002 | - if ( |
|
| 1003 | - strpos($mime_type, 'image/') === 0 |
|
| 1004 | - and $extension = _image_trouver_extension_depuis_mime($mime_type) |
|
| 1005 | - ) { |
|
| 1006 | - if ( |
|
| 1007 | - $max == 0 |
|
| 1008 | - and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) |
|
| 1009 | - and in_array($extension, formats_image_acceptables()) |
|
| 1010 | - and $charger_si_petite_image |
|
| 1011 | - ) { |
|
| 1012 | - $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); |
|
| 1013 | - } else { |
|
| 1014 | - if ($a['body']) { |
|
| 1015 | - $a['extension'] = $extension; |
|
| 1016 | - $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1017 | - ecrire_fichier($a['fichier'], $a['body']); |
|
| 1018 | - $size_image = @spip_getimagesize($a['fichier']); |
|
| 1019 | - $a['largeur'] = intval($size_image[0]); |
|
| 1020 | - $a['hauteur'] = intval($size_image[1]); |
|
| 1021 | - $a['type_image'] = true; |
|
| 1022 | - } |
|
| 1023 | - } |
|
| 1024 | - } |
|
| 1025 | - |
|
| 1026 | - // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut |
|
| 1027 | - // ce sera mieux que 0x0 |
|
| 1028 | - // Flash is dead! |
|
| 1029 | - if ( |
|
| 1030 | - $a and isset($a['extension']) and $a['extension'] == 'swf' |
|
| 1031 | - and empty($a['largeur']) |
|
| 1032 | - ) { |
|
| 1033 | - $a['largeur'] = 425; |
|
| 1034 | - $a['hauteur'] = 350; |
|
| 1035 | - } |
|
| 1036 | - |
|
| 1037 | - if ($mime_type == 'text/html') { |
|
| 1038 | - include_spip('inc/filtres'); |
|
| 1039 | - $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]); |
|
| 1040 | - $page = $page['page'] ?? ''; |
|
| 1041 | - if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { |
|
| 1042 | - $a['titre'] = corriger_caracteres(trim($regs[1])); |
|
| 1043 | - } |
|
| 1044 | - if (!isset($a['taille']) or !$a['taille']) { |
|
| 1045 | - $a['taille'] = strlen($page); # a peu pres |
|
| 1046 | - } |
|
| 1047 | - } |
|
| 1048 | - $a['mime_type'] = $mime_type; |
|
| 1049 | - |
|
| 1050 | - return $a; |
|
| 960 | + // pas la peine de perdre son temps |
|
| 961 | + if (!tester_url_absolue($source)) { |
|
| 962 | + return false; |
|
| 963 | + } |
|
| 964 | + |
|
| 965 | + # charger les alias des types mime |
|
| 966 | + include_spip('base/typedoc'); |
|
| 967 | + |
|
| 968 | + $a = []; |
|
| 969 | + $mime_type = ''; |
|
| 970 | + // On va directement charger le debut des images et des fichiers html, |
|
| 971 | + // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si |
|
| 972 | + // ca echoue l'utilisateur devra les entrer... |
|
| 973 | + $reponse = recuperer_url($source, ['taille_max' => $max, 'refuser_gz' => true]); |
|
| 974 | + $headers = $reponse['headers'] ?? ''; |
|
| 975 | + $a['body'] = $reponse['page'] ?? ''; |
|
| 976 | + if ($headers) { |
|
| 977 | + if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) { |
|
| 978 | + return false; |
|
| 979 | + } |
|
| 980 | + |
|
| 981 | + $a['extension'] = $extension; |
|
| 982 | + |
|
| 983 | + if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) { |
|
| 984 | + $a['taille'] = intval($regs[1]); |
|
| 985 | + } |
|
| 986 | + } |
|
| 987 | + |
|
| 988 | + // Echec avec HEAD, on tente avec GET |
|
| 989 | + if (!$a and !$max) { |
|
| 990 | + spip_log("tenter GET $source", 'distant'); |
|
| 991 | + $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); |
|
| 992 | + } |
|
| 993 | + |
|
| 994 | + // si on a rien trouve pas la peine d'insister |
|
| 995 | + if (!$a) { |
|
| 996 | + return false; |
|
| 997 | + } |
|
| 998 | + |
|
| 999 | + // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller |
|
| 1000 | + // recharger le document en GET et recuperer des donnees supplementaires... |
|
| 1001 | + include_spip('inc/filtres_images_lib_mini'); |
|
| 1002 | + if ( |
|
| 1003 | + strpos($mime_type, 'image/') === 0 |
|
| 1004 | + and $extension = _image_trouver_extension_depuis_mime($mime_type) |
|
| 1005 | + ) { |
|
| 1006 | + if ( |
|
| 1007 | + $max == 0 |
|
| 1008 | + and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) |
|
| 1009 | + and in_array($extension, formats_image_acceptables()) |
|
| 1010 | + and $charger_si_petite_image |
|
| 1011 | + ) { |
|
| 1012 | + $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); |
|
| 1013 | + } else { |
|
| 1014 | + if ($a['body']) { |
|
| 1015 | + $a['extension'] = $extension; |
|
| 1016 | + $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1017 | + ecrire_fichier($a['fichier'], $a['body']); |
|
| 1018 | + $size_image = @spip_getimagesize($a['fichier']); |
|
| 1019 | + $a['largeur'] = intval($size_image[0]); |
|
| 1020 | + $a['hauteur'] = intval($size_image[1]); |
|
| 1021 | + $a['type_image'] = true; |
|
| 1022 | + } |
|
| 1023 | + } |
|
| 1024 | + } |
|
| 1025 | + |
|
| 1026 | + // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut |
|
| 1027 | + // ce sera mieux que 0x0 |
|
| 1028 | + // Flash is dead! |
|
| 1029 | + if ( |
|
| 1030 | + $a and isset($a['extension']) and $a['extension'] == 'swf' |
|
| 1031 | + and empty($a['largeur']) |
|
| 1032 | + ) { |
|
| 1033 | + $a['largeur'] = 425; |
|
| 1034 | + $a['hauteur'] = 350; |
|
| 1035 | + } |
|
| 1036 | + |
|
| 1037 | + if ($mime_type == 'text/html') { |
|
| 1038 | + include_spip('inc/filtres'); |
|
| 1039 | + $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]); |
|
| 1040 | + $page = $page['page'] ?? ''; |
|
| 1041 | + if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { |
|
| 1042 | + $a['titre'] = corriger_caracteres(trim($regs[1])); |
|
| 1043 | + } |
|
| 1044 | + if (!isset($a['taille']) or !$a['taille']) { |
|
| 1045 | + $a['taille'] = strlen($page); # a peu pres |
|
| 1046 | + } |
|
| 1047 | + } |
|
| 1048 | + $a['mime_type'] = $mime_type; |
|
| 1049 | + |
|
| 1050 | + return $a; |
|
| 1051 | 1051 | } |
| 1052 | 1052 | |
| 1053 | 1053 | /** |
@@ -1056,70 +1056,70 @@ discard block |
||
| 1056 | 1056 | * @return false|mixed |
| 1057 | 1057 | */ |
| 1058 | 1058 | function distant_trouver_extension_selon_headers($source, $headers) { |
| 1059 | - if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) { |
|
| 1060 | - $mime_type = (trim($regs[1])); |
|
| 1061 | - } else { |
|
| 1062 | - $mime_type = ''; |
|
| 1063 | - } // inconnu |
|
| 1064 | - |
|
| 1065 | - // Appliquer les alias |
|
| 1066 | - while (isset($GLOBALS['mime_alias'][$mime_type])) { |
|
| 1067 | - $mime_type = $GLOBALS['mime_alias'][$mime_type]; |
|
| 1068 | - } |
|
| 1069 | - |
|
| 1070 | - // pour corriger_extension() |
|
| 1071 | - include_spip('inc/documents'); |
|
| 1072 | - |
|
| 1073 | - // Si on a un mime-type insignifiant |
|
| 1074 | - // text/plain,application/octet-stream ou vide |
|
| 1075 | - // c'est peut-etre que le serveur ne sait pas |
|
| 1076 | - // ce qu'il sert ; on va tenter de detecter via l'extension de l'url |
|
| 1077 | - // ou le Content-Disposition: attachment; filename=... |
|
| 1078 | - $t = null; |
|
| 1079 | - if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) { |
|
| 1080 | - if ( |
|
| 1081 | - !$t |
|
| 1082 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1083 | - ) { |
|
| 1084 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1085 | - } |
|
| 1086 | - if ( |
|
| 1087 | - !$t |
|
| 1088 | - and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
|
| 1089 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
|
| 1090 | - ) { |
|
| 1091 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1092 | - } |
|
| 1093 | - } |
|
| 1094 | - |
|
| 1095 | - // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
|
| 1096 | - if (!$t) { |
|
| 1097 | - $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1098 | - } |
|
| 1099 | - |
|
| 1100 | - // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
|
| 1101 | - // On essaie de nouveau avec l'extension |
|
| 1102 | - if ( |
|
| 1103 | - !$t |
|
| 1104 | - and $mime_type != 'text/plain' |
|
| 1105 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1106 | - ) { |
|
| 1107 | - # eviter xxx.3 => 3gp (> SPIP 3) |
|
| 1108 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1109 | - } |
|
| 1110 | - |
|
| 1111 | - if ($t) { |
|
| 1112 | - spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1113 | - return $t['extension']; |
|
| 1114 | - } else { |
|
| 1115 | - # par defaut on retombe sur '.bin' si c'est autorise |
|
| 1116 | - spip_log("mime-type $mime_type inconnu", 'distant'); |
|
| 1117 | - $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'"); |
|
| 1118 | - if (!$t) { |
|
| 1119 | - return false; |
|
| 1120 | - } |
|
| 1121 | - return $t['extension']; |
|
| 1122 | - } |
|
| 1059 | + if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) { |
|
| 1060 | + $mime_type = (trim($regs[1])); |
|
| 1061 | + } else { |
|
| 1062 | + $mime_type = ''; |
|
| 1063 | + } // inconnu |
|
| 1064 | + |
|
| 1065 | + // Appliquer les alias |
|
| 1066 | + while (isset($GLOBALS['mime_alias'][$mime_type])) { |
|
| 1067 | + $mime_type = $GLOBALS['mime_alias'][$mime_type]; |
|
| 1068 | + } |
|
| 1069 | + |
|
| 1070 | + // pour corriger_extension() |
|
| 1071 | + include_spip('inc/documents'); |
|
| 1072 | + |
|
| 1073 | + // Si on a un mime-type insignifiant |
|
| 1074 | + // text/plain,application/octet-stream ou vide |
|
| 1075 | + // c'est peut-etre que le serveur ne sait pas |
|
| 1076 | + // ce qu'il sert ; on va tenter de detecter via l'extension de l'url |
|
| 1077 | + // ou le Content-Disposition: attachment; filename=... |
|
| 1078 | + $t = null; |
|
| 1079 | + if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) { |
|
| 1080 | + if ( |
|
| 1081 | + !$t |
|
| 1082 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1083 | + ) { |
|
| 1084 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1085 | + } |
|
| 1086 | + if ( |
|
| 1087 | + !$t |
|
| 1088 | + and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
|
| 1089 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
|
| 1090 | + ) { |
|
| 1091 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1092 | + } |
|
| 1093 | + } |
|
| 1094 | + |
|
| 1095 | + // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
|
| 1096 | + if (!$t) { |
|
| 1097 | + $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1098 | + } |
|
| 1099 | + |
|
| 1100 | + // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
|
| 1101 | + // On essaie de nouveau avec l'extension |
|
| 1102 | + if ( |
|
| 1103 | + !$t |
|
| 1104 | + and $mime_type != 'text/plain' |
|
| 1105 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1106 | + ) { |
|
| 1107 | + # eviter xxx.3 => 3gp (> SPIP 3) |
|
| 1108 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1109 | + } |
|
| 1110 | + |
|
| 1111 | + if ($t) { |
|
| 1112 | + spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1113 | + return $t['extension']; |
|
| 1114 | + } else { |
|
| 1115 | + # par defaut on retombe sur '.bin' si c'est autorise |
|
| 1116 | + spip_log("mime-type $mime_type inconnu", 'distant'); |
|
| 1117 | + $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'"); |
|
| 1118 | + if (!$t) { |
|
| 1119 | + return false; |
|
| 1120 | + } |
|
| 1121 | + return $t['extension']; |
|
| 1122 | + } |
|
| 1123 | 1123 | } |
| 1124 | 1124 | |
| 1125 | 1125 | /** |
@@ -1135,45 +1135,45 @@ discard block |
||
| 1135 | 1135 | */ |
| 1136 | 1136 | function need_proxy($host, $http_proxy = null, $http_noproxy = null) { |
| 1137 | 1137 | |
| 1138 | - $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null; |
|
| 1138 | + $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null; |
|
| 1139 | 1139 | |
| 1140 | - // rien a faire si pas de proxy :) |
|
| 1141 | - if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) { |
|
| 1142 | - return ''; |
|
| 1143 | - } |
|
| 1144 | - |
|
| 1145 | - if (is_null($http_noproxy)) { |
|
| 1146 | - $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null; |
|
| 1147 | - } |
|
| 1148 | - // si pas d'exception, on retourne le proxy |
|
| 1149 | - if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) { |
|
| 1150 | - return $http_proxy; |
|
| 1151 | - } |
|
| 1152 | - |
|
| 1153 | - // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception |
|
| 1154 | - // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne |
|
| 1155 | - $http_noproxy = str_replace("\n", ' ', $http_noproxy); |
|
| 1156 | - $http_noproxy = str_replace("\r", ' ', $http_noproxy); |
|
| 1157 | - $http_noproxy = " $http_noproxy "; |
|
| 1158 | - $domain = $host; |
|
| 1159 | - // si le domaine exact www.example.org est dans les exceptions |
|
| 1160 | - if (strpos($http_noproxy, (string) " $domain ") !== false) { |
|
| 1161 | - return ''; |
|
| 1162 | - } |
|
| 1163 | - |
|
| 1164 | - while (strpos($domain, '.') !== false) { |
|
| 1165 | - $domain = explode('.', $domain); |
|
| 1166 | - array_shift($domain); |
|
| 1167 | - $domain = implode('.', $domain); |
|
| 1168 | - |
|
| 1169 | - // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines) |
|
| 1170 | - if (strpos($http_noproxy, (string) " .$domain ") !== false) { |
|
| 1171 | - return ''; |
|
| 1172 | - } |
|
| 1173 | - } |
|
| 1174 | - |
|
| 1175 | - // ok c'est pas une exception |
|
| 1176 | - return $http_proxy; |
|
| 1140 | + // rien a faire si pas de proxy :) |
|
| 1141 | + if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) { |
|
| 1142 | + return ''; |
|
| 1143 | + } |
|
| 1144 | + |
|
| 1145 | + if (is_null($http_noproxy)) { |
|
| 1146 | + $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null; |
|
| 1147 | + } |
|
| 1148 | + // si pas d'exception, on retourne le proxy |
|
| 1149 | + if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) { |
|
| 1150 | + return $http_proxy; |
|
| 1151 | + } |
|
| 1152 | + |
|
| 1153 | + // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception |
|
| 1154 | + // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne |
|
| 1155 | + $http_noproxy = str_replace("\n", ' ', $http_noproxy); |
|
| 1156 | + $http_noproxy = str_replace("\r", ' ', $http_noproxy); |
|
| 1157 | + $http_noproxy = " $http_noproxy "; |
|
| 1158 | + $domain = $host; |
|
| 1159 | + // si le domaine exact www.example.org est dans les exceptions |
|
| 1160 | + if (strpos($http_noproxy, (string) " $domain ") !== false) { |
|
| 1161 | + return ''; |
|
| 1162 | + } |
|
| 1163 | + |
|
| 1164 | + while (strpos($domain, '.') !== false) { |
|
| 1165 | + $domain = explode('.', $domain); |
|
| 1166 | + array_shift($domain); |
|
| 1167 | + $domain = implode('.', $domain); |
|
| 1168 | + |
|
| 1169 | + // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines) |
|
| 1170 | + if (strpos($http_noproxy, (string) " .$domain ") !== false) { |
|
| 1171 | + return ''; |
|
| 1172 | + } |
|
| 1173 | + } |
|
| 1174 | + |
|
| 1175 | + // ok c'est pas une exception |
|
| 1176 | + return $http_proxy; |
|
| 1177 | 1177 | } |
| 1178 | 1178 | |
| 1179 | 1179 | |
@@ -1196,59 +1196,59 @@ discard block |
||
| 1196 | 1196 | * @return array |
| 1197 | 1197 | */ |
| 1198 | 1198 | function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = '', $vers = 'HTTP/1.0', $date = '') { |
| 1199 | - $user = $via_proxy = $proxy_user = ''; |
|
| 1200 | - $fopen = false; |
|
| 1201 | - |
|
| 1202 | - $t = @parse_url($url); |
|
| 1203 | - $host = $t['host']; |
|
| 1204 | - if ($t['scheme'] == 'http') { |
|
| 1205 | - $scheme = 'http'; |
|
| 1206 | - $noproxy = ''; |
|
| 1207 | - } elseif ($t['scheme'] == 'https') { |
|
| 1208 | - $scheme = 'ssl'; |
|
| 1209 | - $noproxy = 'ssl://'; |
|
| 1210 | - if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1211 | - $t['port'] = 443; |
|
| 1212 | - } |
|
| 1213 | - } else { |
|
| 1214 | - $scheme = $t['scheme']; |
|
| 1215 | - $noproxy = $scheme . '://'; |
|
| 1216 | - } |
|
| 1217 | - if (isset($t['user'])) { |
|
| 1218 | - $user = [$t['user'], $t['pass']]; |
|
| 1219 | - } |
|
| 1220 | - |
|
| 1221 | - if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1222 | - $port = 80; |
|
| 1223 | - } |
|
| 1224 | - if (!isset($t['path']) || !($path = $t['path'])) { |
|
| 1225 | - $path = '/'; |
|
| 1226 | - } |
|
| 1227 | - |
|
| 1228 | - if (!empty($t['query'])) { |
|
| 1229 | - $path .= '?' . $t['query']; |
|
| 1230 | - } |
|
| 1231 | - |
|
| 1232 | - $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
|
| 1233 | - if (!$f or !is_resource($f)) { |
|
| 1234 | - // fallback : fopen si on a pas fait timeout dans lance_requete |
|
| 1235 | - // ce qui correspond a $f===110 |
|
| 1236 | - if ( |
|
| 1237 | - $f !== 110 |
|
| 1238 | - and !need_proxy($host) |
|
| 1239 | - and !_request('tester_proxy') |
|
| 1240 | - and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen']) |
|
| 1241 | - ) { |
|
| 1242 | - $f = @fopen($url, 'rb'); |
|
| 1243 | - spip_log("connexion vers $url par simple fopen", 'distant'); |
|
| 1244 | - $fopen = true; |
|
| 1245 | - } else { |
|
| 1246 | - // echec total |
|
| 1247 | - $f = false; |
|
| 1248 | - } |
|
| 1249 | - } |
|
| 1250 | - |
|
| 1251 | - return [$f, $fopen]; |
|
| 1199 | + $user = $via_proxy = $proxy_user = ''; |
|
| 1200 | + $fopen = false; |
|
| 1201 | + |
|
| 1202 | + $t = @parse_url($url); |
|
| 1203 | + $host = $t['host']; |
|
| 1204 | + if ($t['scheme'] == 'http') { |
|
| 1205 | + $scheme = 'http'; |
|
| 1206 | + $noproxy = ''; |
|
| 1207 | + } elseif ($t['scheme'] == 'https') { |
|
| 1208 | + $scheme = 'ssl'; |
|
| 1209 | + $noproxy = 'ssl://'; |
|
| 1210 | + if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1211 | + $t['port'] = 443; |
|
| 1212 | + } |
|
| 1213 | + } else { |
|
| 1214 | + $scheme = $t['scheme']; |
|
| 1215 | + $noproxy = $scheme . '://'; |
|
| 1216 | + } |
|
| 1217 | + if (isset($t['user'])) { |
|
| 1218 | + $user = [$t['user'], $t['pass']]; |
|
| 1219 | + } |
|
| 1220 | + |
|
| 1221 | + if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1222 | + $port = 80; |
|
| 1223 | + } |
|
| 1224 | + if (!isset($t['path']) || !($path = $t['path'])) { |
|
| 1225 | + $path = '/'; |
|
| 1226 | + } |
|
| 1227 | + |
|
| 1228 | + if (!empty($t['query'])) { |
|
| 1229 | + $path .= '?' . $t['query']; |
|
| 1230 | + } |
|
| 1231 | + |
|
| 1232 | + $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
|
| 1233 | + if (!$f or !is_resource($f)) { |
|
| 1234 | + // fallback : fopen si on a pas fait timeout dans lance_requete |
|
| 1235 | + // ce qui correspond a $f===110 |
|
| 1236 | + if ( |
|
| 1237 | + $f !== 110 |
|
| 1238 | + and !need_proxy($host) |
|
| 1239 | + and !_request('tester_proxy') |
|
| 1240 | + and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen']) |
|
| 1241 | + ) { |
|
| 1242 | + $f = @fopen($url, 'rb'); |
|
| 1243 | + spip_log("connexion vers $url par simple fopen", 'distant'); |
|
| 1244 | + $fopen = true; |
|
| 1245 | + } else { |
|
| 1246 | + // echec total |
|
| 1247 | + $f = false; |
|
| 1248 | + } |
|
| 1249 | + } |
|
| 1250 | + |
|
| 1251 | + return [$f, $fopen]; |
|
| 1252 | 1252 | } |
| 1253 | 1253 | |
| 1254 | 1254 | /** |
@@ -1283,125 +1283,125 @@ discard block |
||
| 1283 | 1283 | * resource socket vers l'url demandee |
| 1284 | 1284 | */ |
| 1285 | 1285 | function lance_requete( |
| 1286 | - $method, |
|
| 1287 | - $scheme, |
|
| 1288 | - $user, |
|
| 1289 | - $host, |
|
| 1290 | - $path, |
|
| 1291 | - $port, |
|
| 1292 | - $noproxy, |
|
| 1293 | - $refuse_gz = false, |
|
| 1294 | - $referer = '', |
|
| 1295 | - $datas = '', |
|
| 1296 | - $vers = 'HTTP/1.0', |
|
| 1297 | - $date = '' |
|
| 1286 | + $method, |
|
| 1287 | + $scheme, |
|
| 1288 | + $user, |
|
| 1289 | + $host, |
|
| 1290 | + $path, |
|
| 1291 | + $port, |
|
| 1292 | + $noproxy, |
|
| 1293 | + $refuse_gz = false, |
|
| 1294 | + $referer = '', |
|
| 1295 | + $datas = '', |
|
| 1296 | + $vers = 'HTTP/1.0', |
|
| 1297 | + $date = '' |
|
| 1298 | 1298 | ) { |
| 1299 | 1299 | |
| 1300 | - $proxy_user = ''; |
|
| 1301 | - $http_proxy = need_proxy($host); |
|
| 1302 | - if ($user) { |
|
| 1303 | - $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1304 | - } |
|
| 1305 | - |
|
| 1306 | - $connect = ''; |
|
| 1307 | - if ($http_proxy) { |
|
| 1308 | - if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1309 | - $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1310 | - $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1311 | - . "Host: $path_host\r\n" |
|
| 1312 | - . "Proxy-Connection: Keep-Alive\r\n"; |
|
| 1313 | - } else { |
|
| 1314 | - $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1315 | - . (!$user ? '' : "$user@") |
|
| 1316 | - . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1317 | - } |
|
| 1318 | - $t2 = @parse_url($http_proxy); |
|
| 1319 | - $first_host = $t2['host']; |
|
| 1320 | - if (!($port = $t2['port'])) { |
|
| 1321 | - $port = 80; |
|
| 1322 | - } |
|
| 1323 | - if ($t2['user']) { |
|
| 1324 | - $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1325 | - } |
|
| 1326 | - } else { |
|
| 1327 | - $first_host = $noproxy . $host; |
|
| 1328 | - } |
|
| 1329 | - |
|
| 1330 | - if ($connect) { |
|
| 1331 | - $streamContext = stream_context_create([ |
|
| 1332 | - 'ssl' => [ |
|
| 1333 | - 'verify_peer' => false, |
|
| 1334 | - 'allow_self_signed' => true, |
|
| 1335 | - 'SNI_enabled' => true, |
|
| 1336 | - 'peer_name' => $host, |
|
| 1337 | - ] |
|
| 1338 | - ]); |
|
| 1339 | - $f = @stream_socket_client( |
|
| 1340 | - "tcp://$first_host:$port", |
|
| 1341 | - $errno, |
|
| 1342 | - $errstr, |
|
| 1343 | - _INC_DISTANT_CONNECT_TIMEOUT, |
|
| 1344 | - STREAM_CLIENT_CONNECT, |
|
| 1345 | - $streamContext |
|
| 1346 | - ); |
|
| 1347 | - spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect'); |
|
| 1348 | - if (!$f) { |
|
| 1349 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1350 | - return $errno; |
|
| 1351 | - } |
|
| 1352 | - stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1353 | - |
|
| 1354 | - fputs($f, $connect); |
|
| 1355 | - fputs($f, "\r\n"); |
|
| 1356 | - $res = fread($f, 1024); |
|
| 1357 | - if ( |
|
| 1358 | - !$res |
|
| 1359 | - or !count($res = explode(' ', $res)) |
|
| 1360 | - or $res[1] !== '200' |
|
| 1361 | - ) { |
|
| 1362 | - spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1363 | - fclose($f); |
|
| 1364 | - |
|
| 1365 | - return false; |
|
| 1366 | - } |
|
| 1367 | - // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo |
|
| 1368 | - stream_set_blocking($f, true); |
|
| 1369 | - // envoyer le handshake |
|
| 1370 | - stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); |
|
| 1371 | - spip_log("OK CONNECT sur $first_host:$port", 'connect'); |
|
| 1372 | - } else { |
|
| 1373 | - $ntry = 3; |
|
| 1374 | - do { |
|
| 1375 | - $f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1376 | - } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
|
| 1377 | - spip_log("Recuperer $path sur $first_host:$port par $f"); |
|
| 1378 | - if (!$f) { |
|
| 1379 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1380 | - |
|
| 1381 | - return $errno; |
|
| 1382 | - } |
|
| 1383 | - stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1384 | - } |
|
| 1385 | - |
|
| 1386 | - $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
|
| 1387 | - |
|
| 1388 | - $host_port = $host; |
|
| 1389 | - if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1390 | - $host_port .= ":$port"; |
|
| 1391 | - } |
|
| 1392 | - $req = "$method $path $vers\r\n" |
|
| 1393 | - . "Host: $host_port\r\n" |
|
| 1394 | - . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1395 | - . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1396 | - . (!$site ? '' : "Referer: $site/$referer\r\n") |
|
| 1397 | - . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1398 | - . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1399 | - . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
|
| 1400 | - . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
|
| 1300 | + $proxy_user = ''; |
|
| 1301 | + $http_proxy = need_proxy($host); |
|
| 1302 | + if ($user) { |
|
| 1303 | + $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1304 | + } |
|
| 1305 | + |
|
| 1306 | + $connect = ''; |
|
| 1307 | + if ($http_proxy) { |
|
| 1308 | + if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1309 | + $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1310 | + $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1311 | + . "Host: $path_host\r\n" |
|
| 1312 | + . "Proxy-Connection: Keep-Alive\r\n"; |
|
| 1313 | + } else { |
|
| 1314 | + $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1315 | + . (!$user ? '' : "$user@") |
|
| 1316 | + . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1317 | + } |
|
| 1318 | + $t2 = @parse_url($http_proxy); |
|
| 1319 | + $first_host = $t2['host']; |
|
| 1320 | + if (!($port = $t2['port'])) { |
|
| 1321 | + $port = 80; |
|
| 1322 | + } |
|
| 1323 | + if ($t2['user']) { |
|
| 1324 | + $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1325 | + } |
|
| 1326 | + } else { |
|
| 1327 | + $first_host = $noproxy . $host; |
|
| 1328 | + } |
|
| 1329 | + |
|
| 1330 | + if ($connect) { |
|
| 1331 | + $streamContext = stream_context_create([ |
|
| 1332 | + 'ssl' => [ |
|
| 1333 | + 'verify_peer' => false, |
|
| 1334 | + 'allow_self_signed' => true, |
|
| 1335 | + 'SNI_enabled' => true, |
|
| 1336 | + 'peer_name' => $host, |
|
| 1337 | + ] |
|
| 1338 | + ]); |
|
| 1339 | + $f = @stream_socket_client( |
|
| 1340 | + "tcp://$first_host:$port", |
|
| 1341 | + $errno, |
|
| 1342 | + $errstr, |
|
| 1343 | + _INC_DISTANT_CONNECT_TIMEOUT, |
|
| 1344 | + STREAM_CLIENT_CONNECT, |
|
| 1345 | + $streamContext |
|
| 1346 | + ); |
|
| 1347 | + spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect'); |
|
| 1348 | + if (!$f) { |
|
| 1349 | + spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1350 | + return $errno; |
|
| 1351 | + } |
|
| 1352 | + stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1353 | + |
|
| 1354 | + fputs($f, $connect); |
|
| 1355 | + fputs($f, "\r\n"); |
|
| 1356 | + $res = fread($f, 1024); |
|
| 1357 | + if ( |
|
| 1358 | + !$res |
|
| 1359 | + or !count($res = explode(' ', $res)) |
|
| 1360 | + or $res[1] !== '200' |
|
| 1361 | + ) { |
|
| 1362 | + spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1363 | + fclose($f); |
|
| 1364 | + |
|
| 1365 | + return false; |
|
| 1366 | + } |
|
| 1367 | + // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo |
|
| 1368 | + stream_set_blocking($f, true); |
|
| 1369 | + // envoyer le handshake |
|
| 1370 | + stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); |
|
| 1371 | + spip_log("OK CONNECT sur $first_host:$port", 'connect'); |
|
| 1372 | + } else { |
|
| 1373 | + $ntry = 3; |
|
| 1374 | + do { |
|
| 1375 | + $f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1376 | + } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
|
| 1377 | + spip_log("Recuperer $path sur $first_host:$port par $f"); |
|
| 1378 | + if (!$f) { |
|
| 1379 | + spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1380 | + |
|
| 1381 | + return $errno; |
|
| 1382 | + } |
|
| 1383 | + stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1384 | + } |
|
| 1385 | + |
|
| 1386 | + $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
|
| 1387 | + |
|
| 1388 | + $host_port = $host; |
|
| 1389 | + if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1390 | + $host_port .= ":$port"; |
|
| 1391 | + } |
|
| 1392 | + $req = "$method $path $vers\r\n" |
|
| 1393 | + . "Host: $host_port\r\n" |
|
| 1394 | + . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1395 | + . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1396 | + . (!$site ? '' : "Referer: $site/$referer\r\n") |
|
| 1397 | + . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1398 | + . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1399 | + . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
|
| 1400 | + . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
|
| 1401 | 1401 | |
| 1402 | 1402 | # spip_log("Requete\n$req", 'distant'); |
| 1403 | - fputs($f, $req); |
|
| 1404 | - fputs($f, $datas ?: "\r\n"); |
|
| 1403 | + fputs($f, $req); |
|
| 1404 | + fputs($f, $datas ?: "\r\n"); |
|
| 1405 | 1405 | |
| 1406 | - return $f; |
|
| 1406 | + return $f; |
|
| 1407 | 1407 | } |
@@ -26,7 +26,7 @@ discard block |
||
| 26 | 26 | define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
| 27 | 27 | } |
| 28 | 28 | if (!defined('_INC_DISTANT_USER_AGENT')) { |
| 29 | - define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 29 | + define('_INC_DISTANT_USER_AGENT', 'SPIP-'.$GLOBALS['spip_version_affichee'].' ('.$GLOBALS['home_server'].')'); |
|
| 30 | 30 | } |
| 31 | 31 | if (!defined('_INC_DISTANT_MAX_SIZE')) { |
| 32 | 32 | define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
@@ -35,7 +35,7 @@ discard block |
||
| 35 | 35 | define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
| 36 | 36 | } |
| 37 | 37 | |
| 38 | -define('_REGEXP_COPIE_LOCALE', ',' . |
|
| 38 | +define('_REGEXP_COPIE_LOCALE', ','. |
|
| 39 | 39 | preg_replace( |
| 40 | 40 | '@^https?:@', |
| 41 | 41 | 'https?:', |
@@ -70,7 +70,7 @@ discard block |
||
| 70 | 70 | |
| 71 | 71 | // si c'est la protection de soi-meme, retourner le path |
| 72 | 72 | if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
| 73 | - $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 73 | + $source = substr(_DIR_IMG, strlen(_DIR_RACINE)).urldecode($match[1]); |
|
| 74 | 74 | |
| 75 | 75 | return @file_exists($source) ? $source : false; |
| 76 | 76 | } |
@@ -90,7 +90,7 @@ discard block |
||
| 90 | 90 | return false; |
| 91 | 91 | } |
| 92 | 92 | |
| 93 | - $localrac = _DIR_RACINE . $local; |
|
| 93 | + $localrac = _DIR_RACINE.$local; |
|
| 94 | 94 | $t = ($mode === 'force') ? false : @file_exists($localrac); |
| 95 | 95 | |
| 96 | 96 | // test d'existence du fichier |
@@ -115,10 +115,10 @@ discard block |
||
| 115 | 115 | ['file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
| 116 | 116 | ); |
| 117 | 117 | if (!$res or (!$res['length'] and $res['status'] != 304)) { |
| 118 | - spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 118 | + spip_log("copie_locale : Echec recuperation $source sur $localrac status : ".($res ? $res['status'] : '-'), 'distant'._LOG_INFO_IMPORTANTE); |
|
| 119 | 119 | } |
| 120 | 120 | else { |
| 121 | - spip_log("copie_locale : recuperation $source sur $localrac OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 121 | + spip_log("copie_locale : recuperation $source sur $localrac OK | taille ".$res['length'].' status '.$res['status'], 'distant'); |
|
| 122 | 122 | } |
| 123 | 123 | if (!$res or !$res['length']) { |
| 124 | 124 | // si $t c'est sans doute juste un not-modified-since |
@@ -207,7 +207,7 @@ discard block |
||
| 207 | 207 | |
| 208 | 208 | if (!$is_known_host) { |
| 209 | 209 | $host = trim($parsed_url['host'], '.'); |
| 210 | - if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 210 | + if (!$ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 211 | 211 | $ip = gethostbyname($host); |
| 212 | 212 | if ($ip === $host) { |
| 213 | 213 | // Error condition for gethostbyname() |
@@ -228,7 +228,7 @@ discard block |
||
| 228 | 228 | } |
| 229 | 229 | } |
| 230 | 230 | if ($ip) { |
| 231 | - if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 231 | + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 232 | 232 | return false; |
| 233 | 233 | } |
| 234 | 234 | } |
@@ -239,7 +239,7 @@ discard block |
||
| 239 | 239 | } |
| 240 | 240 | |
| 241 | 241 | $port = $parsed_url['port']; |
| 242 | - if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 242 | + if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 243 | 243 | return $url; |
| 244 | 244 | } |
| 245 | 245 | |
@@ -309,7 +309,7 @@ discard block |
||
| 309 | 309 | } |
| 310 | 310 | } |
| 311 | 311 | if ($taille > 500) { |
| 312 | - $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 312 | + $boundary = substr(md5(random_int(0, mt_getrandmax()).'spip'), 0, 8); |
|
| 313 | 313 | } |
| 314 | 314 | } |
| 315 | 315 | |
@@ -337,16 +337,16 @@ discard block |
||
| 337 | 337 | } |
| 338 | 338 | } else { |
| 339 | 339 | // fabrique une chaine HTTP simple pour un POST |
| 340 | - $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 340 | + $entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n"; |
|
| 341 | 341 | $chaine = []; |
| 342 | 342 | if (is_array($donnees)) { |
| 343 | 343 | foreach ($donnees as $cle => $valeur) { |
| 344 | 344 | if (is_array($valeur)) { |
| 345 | 345 | foreach ($valeur as $val2) { |
| 346 | - $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 346 | + $chaine[] = rawurlencode($cle).'[]='.rawurlencode($val2); |
|
| 347 | 347 | } |
| 348 | 348 | } else { |
| 349 | - $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 349 | + $chaine[] = rawurlencode($cle).'='.rawurlencode($valeur); |
|
| 350 | 350 | } |
| 351 | 351 | } |
| 352 | 352 | $chaine = implode('&', $chaine); |
@@ -451,13 +451,13 @@ discard block |
||
| 451 | 451 | $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
| 452 | 452 | } |
| 453 | 453 | |
| 454 | - spip_log("recuperer_url " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 454 | + spip_log("recuperer_url ".$options['methode']." sur $url", 'distant'._LOG_DEBUG); |
|
| 455 | 455 | |
| 456 | 456 | // Ajout des en-têtes spécifiques si besoin |
| 457 | 457 | $formatted_data = ''; |
| 458 | 458 | if (!empty($options['headers'])) { |
| 459 | 459 | foreach ($options['headers'] as $champ => $valeur) { |
| 460 | - $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 460 | + $formatted_data .= $champ.': '.$valeur."\r\n"; |
|
| 461 | 461 | } |
| 462 | 462 | } |
| 463 | 463 | |
@@ -465,9 +465,9 @@ discard block |
||
| 465 | 465 | [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
| 466 | 466 | $head .= $formatted_data; |
| 467 | 467 | if (stripos($head, 'Content-Length:') === false) { |
| 468 | - $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 468 | + $head .= 'Content-Length: '.strlen($postdata)."\r\n"; |
|
| 469 | 469 | } |
| 470 | - $formatted_data = $head . "\r\n" . $postdata; |
|
| 470 | + $formatted_data = $head."\r\n".$postdata; |
|
| 471 | 471 | if ( |
| 472 | 472 | strlen($postdata) |
| 473 | 473 | and !$methode_demandee |
@@ -481,9 +481,9 @@ discard block |
||
| 481 | 481 | // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
| 482 | 482 | $url = preg_replace(',^feed://,i', 'http://', $url); |
| 483 | 483 | if (!tester_url_absolue($url)) { |
| 484 | - $url = 'http://' . $url; |
|
| 484 | + $url = 'http://'.$url; |
|
| 485 | 485 | } elseif (strncmp($url, '//', 2) == 0) { |
| 486 | - $url = 'http:' . $url; |
|
| 486 | + $url = 'http:'.$url; |
|
| 487 | 487 | } |
| 488 | 488 | |
| 489 | 489 | $url = url_to_ascii($url); |
@@ -512,7 +512,7 @@ discard block |
||
| 512 | 512 | $options['if_modified_since'] |
| 513 | 513 | ); |
| 514 | 514 | if (!$handle) { |
| 515 | - spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 515 | + spip_log("ECHEC init_http $url", 'distant'._LOG_ERREUR); |
|
| 516 | 516 | |
| 517 | 517 | return false; |
| 518 | 518 | } |
@@ -542,7 +542,7 @@ discard block |
||
| 542 | 542 | 'status' => 200, |
| 543 | 543 | ]; |
| 544 | 544 | } else { |
| 545 | - spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 545 | + spip_log("ECHEC chinoiserie $url", 'distant'._LOG_ERREUR); |
|
| 546 | 546 | return false; |
| 547 | 547 | } |
| 548 | 548 | } elseif ($res['location'] and $options['follow_location']) { |
@@ -558,11 +558,11 @@ discard block |
||
| 558 | 558 | $options['datas'] = ''; |
| 559 | 559 | } |
| 560 | 560 | } |
| 561 | - spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant' . _LOG_DEBUG); |
|
| 561 | + spip_log("recuperer_url recommence ".$options['methode']." sur $url", 'distant'._LOG_DEBUG); |
|
| 562 | 562 | |
| 563 | 563 | return recuperer_url($url, $options); |
| 564 | 564 | } elseif ($res['status'] !== 200) { |
| 565 | - spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 565 | + spip_log('HTTP status '.$res['status']." pour $url", 'distant'); |
|
| 566 | 566 | } |
| 567 | 567 | $result['status'] = $res['status']; |
| 568 | 568 | if (isset($res['headers'])) { |
@@ -578,7 +578,7 @@ discard block |
||
| 578 | 578 | |
| 579 | 579 | // on ne veut que les entetes |
| 580 | 580 | if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
| 581 | - spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 581 | + spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($result), 'distant'._LOG_DEBUG); |
|
| 582 | 582 | return $result; |
| 583 | 583 | } |
| 584 | 584 | |
@@ -588,7 +588,7 @@ discard block |
||
| 588 | 588 | |
| 589 | 589 | $gz = false; |
| 590 | 590 | if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
| 591 | - $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 591 | + $gz = (_DIR_TMP.md5(uniqid(random_int(0, mt_getrandmax()))).'.tmp.gz'); |
|
| 592 | 592 | } |
| 593 | 593 | |
| 594 | 594 | // si on a pas deja recuperer le contenu par une methode detournee |
@@ -624,7 +624,7 @@ discard block |
||
| 624 | 624 | |
| 625 | 625 | $trace = json_decode(json_encode($result), true); |
| 626 | 626 | $trace['page'] = '...'; |
| 627 | - spip_log("RESULTAT recuperer_url " . $options['methode']. " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 627 | + spip_log("RESULTAT recuperer_url ".$options['methode']." sur $url : ".json_encode($trace), 'distant'._LOG_DEBUG); |
|
| 628 | 628 | |
| 629 | 629 | return $result; |
| 630 | 630 | } |
@@ -678,7 +678,7 @@ discard block |
||
| 678 | 678 | $sig['url'] = $url; |
| 679 | 679 | |
| 680 | 680 | $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
| 681 | - $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 681 | + $cache = md5(serialize($sig)).'-'.substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 682 | 682 | $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
| 683 | 683 | $cache = "$sub$cache"; |
| 684 | 684 | |
@@ -732,7 +732,7 @@ discard block |
||
| 732 | 732 | $fp = false; |
| 733 | 733 | if ($fichier) { |
| 734 | 734 | include_spip('inc/acces'); |
| 735 | - $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 735 | + $tmpfile = "$fichier.".creer_uniqid().'.tmp'; |
|
| 736 | 736 | $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
| 737 | 737 | if (!$fp and file_exists($fichier)) { |
| 738 | 738 | return filesize($fichier); |
@@ -791,7 +791,7 @@ discard block |
||
| 791 | 791 | } |
| 792 | 792 | $result['status'] = intval($r[1]); |
| 793 | 793 | while ($s = trim(fgets($handle, 16384))) { |
| 794 | - $result['headers'][] = $s . "\n"; |
|
| 794 | + $result['headers'][] = $s."\n"; |
|
| 795 | 795 | preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
| 796 | 796 | [, $d, $v] = $r; |
| 797 | 797 | if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
@@ -840,13 +840,13 @@ discard block |
||
| 840 | 840 | |
| 841 | 841 | // on se place tout le temps comme si on etait a la racine |
| 842 | 842 | if (_DIR_RACINE) { |
| 843 | - $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 843 | + $d = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $d); |
|
| 844 | 844 | } |
| 845 | 845 | |
| 846 | 846 | $m = md5($source); |
| 847 | 847 | |
| 848 | 848 | return $d |
| 849 | - . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 849 | + . substr(preg_replace(',[^\w-],', '', basename($source)).'-'.$m, 0, 12) |
|
| 850 | 850 | . substr($m, 0, 4) |
| 851 | 851 | . ".$extension"; |
| 852 | 852 | } |
@@ -869,7 +869,7 @@ discard block |
||
| 869 | 869 | // Si c'est deja local pas de souci |
| 870 | 870 | if (!tester_url_absolue($source)) { |
| 871 | 871 | if (_DIR_RACINE) { |
| 872 | - $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 872 | + $source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source); |
|
| 873 | 873 | } |
| 874 | 874 | |
| 875 | 875 | return $source; |
@@ -887,7 +887,7 @@ discard block |
||
| 887 | 887 | $ext |
| 888 | 888 | and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
| 889 | 889 | and $f = nom_fichier_copie_locale($source, $ext) |
| 890 | - and file_exists(_DIR_RACINE . $f) |
|
| 890 | + and file_exists(_DIR_RACINE.$f) |
|
| 891 | 891 | ) { |
| 892 | 892 | return $f; |
| 893 | 893 | } |
@@ -895,7 +895,7 @@ discard block |
||
| 895 | 895 | |
| 896 | 896 | // Si c'est deja dans la table des documents, |
| 897 | 897 | // ramener le nom de sa copie potentielle |
| 898 | - $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 898 | + $ext = sql_getfetsel('extension', 'spip_documents', 'fichier='.sql_quote($source)." AND distant='oui' AND extension <> ''"); |
|
| 899 | 899 | |
| 900 | 900 | if ($ext) { |
| 901 | 901 | return nom_fichier_copie_locale($source, $ext); |
@@ -906,9 +906,9 @@ discard block |
||
| 906 | 906 | |
| 907 | 907 | $ext = $path_parts ? $path_parts['extension'] : ''; |
| 908 | 908 | |
| 909 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 909 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) { |
|
| 910 | 910 | $f = nom_fichier_copie_locale($source, $ext); |
| 911 | - if (file_exists(_DIR_RACINE . $f)) { |
|
| 911 | + if (file_exists(_DIR_RACINE.$f)) { |
|
| 912 | 912 | return $f; |
| 913 | 913 | } |
| 914 | 914 | } |
@@ -916,7 +916,7 @@ discard block |
||
| 916 | 916 | // Ping pour voir si son extension est connue et autorisee |
| 917 | 917 | // avec mise en cache du resultat du ping |
| 918 | 918 | |
| 919 | - $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 919 | + $cache = sous_repertoire(_DIR_CACHE, 'rid').md5($source); |
|
| 920 | 920 | if ( |
| 921 | 921 | !@file_exists($cache) |
| 922 | 922 | or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
@@ -926,10 +926,10 @@ discard block |
||
| 926 | 926 | ecrire_fichier($cache, serialize($path_parts)); |
| 927 | 927 | } |
| 928 | 928 | $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
| 929 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 929 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) { |
|
| 930 | 930 | return nom_fichier_copie_locale($source, $ext); |
| 931 | 931 | } |
| 932 | - spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 932 | + spip_log("pas de copie locale pour $source", 'distant'._LOG_ERREUR); |
|
| 933 | 933 | } |
| 934 | 934 | |
| 935 | 935 | |
@@ -1013,7 +1013,7 @@ discard block |
||
| 1013 | 1013 | } else { |
| 1014 | 1014 | if ($a['body']) { |
| 1015 | 1015 | $a['extension'] = $extension; |
| 1016 | - $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1016 | + $a['fichier'] = _DIR_RACINE.nom_fichier_copie_locale($source, $extension); |
|
| 1017 | 1017 | ecrire_fichier($a['fichier'], $a['body']); |
| 1018 | 1018 | $size_image = @spip_getimagesize($a['fichier']); |
| 1019 | 1019 | $a['largeur'] = intval($size_image[0]); |
@@ -1081,20 +1081,20 @@ discard block |
||
| 1081 | 1081 | !$t |
| 1082 | 1082 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
| 1083 | 1083 | ) { |
| 1084 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1084 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1085 | 1085 | } |
| 1086 | 1086 | if ( |
| 1087 | 1087 | !$t |
| 1088 | 1088 | and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
| 1089 | 1089 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
| 1090 | 1090 | ) { |
| 1091 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1091 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1092 | 1092 | } |
| 1093 | 1093 | } |
| 1094 | 1094 | |
| 1095 | 1095 | // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
| 1096 | 1096 | if (!$t) { |
| 1097 | - $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1097 | + $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type='.sql_quote($mime_type)); |
|
| 1098 | 1098 | } |
| 1099 | 1099 | |
| 1100 | 1100 | // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
@@ -1105,11 +1105,11 @@ discard block |
||
| 1105 | 1105 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
| 1106 | 1106 | ) { |
| 1107 | 1107 | # eviter xxx.3 => 3gp (> SPIP 3) |
| 1108 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1108 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1109 | 1109 | } |
| 1110 | 1110 | |
| 1111 | 1111 | if ($t) { |
| 1112 | - spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1112 | + spip_log("mime-type $mime_type ok, extension ".$t['extension'], 'distant'); |
|
| 1113 | 1113 | return $t['extension']; |
| 1114 | 1114 | } else { |
| 1115 | 1115 | # par defaut on retombe sur '.bin' si c'est autorise |
@@ -1212,7 +1212,7 @@ discard block |
||
| 1212 | 1212 | } |
| 1213 | 1213 | } else { |
| 1214 | 1214 | $scheme = $t['scheme']; |
| 1215 | - $noproxy = $scheme . '://'; |
|
| 1215 | + $noproxy = $scheme.'://'; |
|
| 1216 | 1216 | } |
| 1217 | 1217 | if (isset($t['user'])) { |
| 1218 | 1218 | $user = [$t['user'], $t['pass']]; |
@@ -1226,7 +1226,7 @@ discard block |
||
| 1226 | 1226 | } |
| 1227 | 1227 | |
| 1228 | 1228 | if (!empty($t['query'])) { |
| 1229 | - $path .= '?' . $t['query']; |
|
| 1229 | + $path .= '?'.$t['query']; |
|
| 1230 | 1230 | } |
| 1231 | 1231 | |
| 1232 | 1232 | $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
@@ -1300,20 +1300,20 @@ discard block |
||
| 1300 | 1300 | $proxy_user = ''; |
| 1301 | 1301 | $http_proxy = need_proxy($host); |
| 1302 | 1302 | if ($user) { |
| 1303 | - $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1303 | + $user = urlencode($user[0]).':'.urlencode($user[1]); |
|
| 1304 | 1304 | } |
| 1305 | 1305 | |
| 1306 | 1306 | $connect = ''; |
| 1307 | 1307 | if ($http_proxy) { |
| 1308 | - if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1309 | - $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1310 | - $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1308 | + if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls', 'ssl'])) { |
|
| 1309 | + $path_host = (!$user ? '' : "$user@").$host.(($port != 80) ? ":$port" : ''); |
|
| 1310 | + $connect = 'CONNECT '.$path_host." $vers\r\n" |
|
| 1311 | 1311 | . "Host: $path_host\r\n" |
| 1312 | 1312 | . "Proxy-Connection: Keep-Alive\r\n"; |
| 1313 | 1313 | } else { |
| 1314 | - $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1314 | + $path = (in_array($scheme, ['tls', 'ssl']) ? 'https://' : "$scheme://") |
|
| 1315 | 1315 | . (!$user ? '' : "$user@") |
| 1316 | - . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1316 | + . "$host".(($port != 80) ? ":$port" : '').$path; |
|
| 1317 | 1317 | } |
| 1318 | 1318 | $t2 = @parse_url($http_proxy); |
| 1319 | 1319 | $first_host = $t2['host']; |
@@ -1321,10 +1321,10 @@ discard block |
||
| 1321 | 1321 | $port = 80; |
| 1322 | 1322 | } |
| 1323 | 1323 | if ($t2['user']) { |
| 1324 | - $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1324 | + $proxy_user = base64_encode($t2['user'].':'.$t2['pass']); |
|
| 1325 | 1325 | } |
| 1326 | 1326 | } else { |
| 1327 | - $first_host = $noproxy . $host; |
|
| 1327 | + $first_host = $noproxy.$host; |
|
| 1328 | 1328 | } |
| 1329 | 1329 | |
| 1330 | 1330 | if ($connect) { |
@@ -1346,7 +1346,7 @@ discard block |
||
| 1346 | 1346 | ); |
| 1347 | 1347 | spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", 'connect'); |
| 1348 | 1348 | if (!$f) { |
| 1349 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1349 | + spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR); |
|
| 1350 | 1350 | return $errno; |
| 1351 | 1351 | } |
| 1352 | 1352 | stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
@@ -1359,7 +1359,7 @@ discard block |
||
| 1359 | 1359 | or !count($res = explode(' ', $res)) |
| 1360 | 1360 | or $res[1] !== '200' |
| 1361 | 1361 | ) { |
| 1362 | - spip_log("Echec CONNECT sur $first_host:$port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1362 | + spip_log("Echec CONNECT sur $first_host:$port", 'connect'._LOG_INFO_IMPORTANTE); |
|
| 1363 | 1363 | fclose($f); |
| 1364 | 1364 | |
| 1365 | 1365 | return false; |
@@ -1376,7 +1376,7 @@ discard block |
||
| 1376 | 1376 | } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
| 1377 | 1377 | spip_log("Recuperer $path sur $first_host:$port par $f"); |
| 1378 | 1378 | if (!$f) { |
| 1379 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1379 | + spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR); |
|
| 1380 | 1380 | |
| 1381 | 1381 | return $errno; |
| 1382 | 1382 | } |
@@ -1386,16 +1386,16 @@ discard block |
||
| 1386 | 1386 | $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
| 1387 | 1387 | |
| 1388 | 1388 | $host_port = $host; |
| 1389 | - if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1389 | + if ($port != (in_array($scheme, ['tls', 'ssl']) ? 443 : 80)) { |
|
| 1390 | 1390 | $host_port .= ":$port"; |
| 1391 | 1391 | } |
| 1392 | 1392 | $req = "$method $path $vers\r\n" |
| 1393 | 1393 | . "Host: $host_port\r\n" |
| 1394 | - . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1395 | - . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1394 | + . 'User-Agent: '._INC_DISTANT_USER_AGENT."\r\n" |
|
| 1395 | + . ($refuse_gz ? '' : ('Accept-Encoding: '._INC_DISTANT_CONTENT_ENCODING."\r\n")) |
|
| 1396 | 1396 | . (!$site ? '' : "Referer: $site/$referer\r\n") |
| 1397 | - . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1398 | - . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1397 | + . (!$date ? '' : 'If-Modified-Since: '.(gmdate('D, d M Y H:i:s', $date)." GMT\r\n")) |
|
| 1398 | + . (!$user ? '' : ('Authorization: Basic '.base64_encode($user)."\r\n")) |
|
| 1399 | 1399 | . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
| 1400 | 1400 | . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
| 1401 | 1401 | |
@@ -147,7 +147,7 @@ discard block |
||
| 147 | 147 | // donc si on est dans le public avec un cache on va perdre le dynamisme |
| 148 | 148 | // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
| 149 | 149 | // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
| 150 | - $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'"; |
|
| 150 | + $p->code = "'<'.'?php echo (".texte_script($p->code)."); ?'.'>'"; |
|
| 151 | 151 | // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave) |
| 152 | 152 | } |
| 153 | 153 | return $p; |
@@ -327,7 +327,7 @@ discard block |
||
| 327 | 327 | foreach ($erreurs as $k => $v) { |
| 328 | 328 | if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) { |
| 329 | 329 | // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form |
| 330 | - $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>'; |
|
| 330 | + $valeurs['erreurs'][$k] = "<span role='alert'>".$erreurs[$k].'</span>'; |
|
| 331 | 331 | } |
| 332 | 332 | } |
| 333 | 333 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Formulaires |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | include_spip('inc/filtres'); |
@@ -35,22 +35,22 @@ discard block |
||
| 35 | 35 | * Saisie protégée |
| 36 | 36 | **/ |
| 37 | 37 | function protege_champ($texte) { |
| 38 | - if (is_array($texte)) { |
|
| 39 | - return array_map('protege_champ', $texte); |
|
| 40 | - } elseif ($texte === null) { |
|
| 41 | - return $texte; |
|
| 42 | - } elseif (is_bool($texte)) { |
|
| 43 | - return $texte ? '1' : ''; |
|
| 44 | - } elseif (is_string($texte) and $texte) { |
|
| 45 | - if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) { |
|
| 46 | - // ne pas corrompre une valeur serialize |
|
| 47 | - return $texte; |
|
| 48 | - } elseif (strpbrk($texte, "&\"'<>") !== false) { |
|
| 49 | - return spip_htmlspecialchars($texte, ENT_QUOTES); |
|
| 50 | - } |
|
| 51 | - } |
|
| 52 | - |
|
| 53 | - return $texte; |
|
| 38 | + if (is_array($texte)) { |
|
| 39 | + return array_map('protege_champ', $texte); |
|
| 40 | + } elseif ($texte === null) { |
|
| 41 | + return $texte; |
|
| 42 | + } elseif (is_bool($texte)) { |
|
| 43 | + return $texte ? '1' : ''; |
|
| 44 | + } elseif (is_string($texte) and $texte) { |
|
| 45 | + if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) { |
|
| 46 | + // ne pas corrompre une valeur serialize |
|
| 47 | + return $texte; |
|
| 48 | + } elseif (strpbrk($texte, "&\"'<>") !== false) { |
|
| 49 | + return spip_htmlspecialchars($texte, ENT_QUOTES); |
|
| 50 | + } |
|
| 51 | + } |
|
| 52 | + |
|
| 53 | + return $texte; |
|
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | /** |
@@ -64,17 +64,17 @@ discard block |
||
| 64 | 64 | * - false : pas de squelette trouvé |
| 65 | 65 | **/ |
| 66 | 66 | function existe_formulaire($form) { |
| 67 | - if (substr($form, 0, 11) == 'FORMULAIRE_') { |
|
| 68 | - $form = strtolower(substr($form, 11)); |
|
| 69 | - } else { |
|
| 70 | - $form = strtolower($form); |
|
| 71 | - } |
|
| 67 | + if (substr($form, 0, 11) == 'FORMULAIRE_') { |
|
| 68 | + $form = strtolower(substr($form, 11)); |
|
| 69 | + } else { |
|
| 70 | + $form = strtolower($form); |
|
| 71 | + } |
|
| 72 | 72 | |
| 73 | - if (!$form) { |
|
| 74 | - return ''; |
|
| 75 | - } // on ne sait pas, le nom du formulaire n'est pas fourni ici |
|
| 73 | + if (!$form) { |
|
| 74 | + return ''; |
|
| 75 | + } // on ne sait pas, le nom du formulaire n'est pas fourni ici |
|
| 76 | 76 | |
| 77 | - return trouver_fond($form, 'formulaires/') ? $form : false; |
|
| 77 | + return trouver_fond($form, 'formulaires/') ? $form : false; |
|
| 78 | 78 | } |
| 79 | 79 | |
| 80 | 80 | /** |
@@ -83,31 +83,31 @@ discard block |
||
| 83 | 83 | * @return false|array |
| 84 | 84 | */ |
| 85 | 85 | function test_formulaire_inclus_par_modele() { |
| 86 | - $trace = debug_backtrace(null, 20); |
|
| 87 | - $trace_fonctions = array_column($trace, 'function'); |
|
| 88 | - $trace_fonctions = array_map('strtolower', $trace_fonctions); |
|
| 89 | - |
|
| 90 | - // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn |
|
| 91 | - if ( |
|
| 92 | - function_exists('arguments_balise_dyn_depuis_modele') |
|
| 93 | - and $form = arguments_balise_dyn_depuis_modele(null, 'read') |
|
| 94 | - ) { |
|
| 95 | - if (in_array('balise_formulaire__dyn', $trace_fonctions)) { |
|
| 96 | - $k = array_search('balise_formulaire__dyn', $trace_fonctions); |
|
| 97 | - if ($trace[$k]['args'][0] === $form) { |
|
| 98 | - return $trace[$k]['args']; |
|
| 99 | - } |
|
| 100 | - } |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil, |
|
| 104 | - // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette |
|
| 105 | - if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) { |
|
| 106 | - $k = array_search('inclure_modele', $trace_fonctions); |
|
| 107 | - // les arguments de recuperer_fond() passes par inclure_modele() |
|
| 108 | - return $trace[$k - 1]['args'][1]['args']; |
|
| 109 | - } |
|
| 110 | - return false; |
|
| 86 | + $trace = debug_backtrace(null, 20); |
|
| 87 | + $trace_fonctions = array_column($trace, 'function'); |
|
| 88 | + $trace_fonctions = array_map('strtolower', $trace_fonctions); |
|
| 89 | + |
|
| 90 | + // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn |
|
| 91 | + if ( |
|
| 92 | + function_exists('arguments_balise_dyn_depuis_modele') |
|
| 93 | + and $form = arguments_balise_dyn_depuis_modele(null, 'read') |
|
| 94 | + ) { |
|
| 95 | + if (in_array('balise_formulaire__dyn', $trace_fonctions)) { |
|
| 96 | + $k = array_search('balise_formulaire__dyn', $trace_fonctions); |
|
| 97 | + if ($trace[$k]['args'][0] === $form) { |
|
| 98 | + return $trace[$k]['args']; |
|
| 99 | + } |
|
| 100 | + } |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil, |
|
| 104 | + // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette |
|
| 105 | + if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) { |
|
| 106 | + $k = array_search('inclure_modele', $trace_fonctions); |
|
| 107 | + // les arguments de recuperer_fond() passes par inclure_modele() |
|
| 108 | + return $trace[$k - 1]['args'][1]['args']; |
|
| 109 | + } |
|
| 110 | + return false; |
|
| 111 | 111 | } |
| 112 | 112 | |
| 113 | 113 | /** |
@@ -122,32 +122,32 @@ discard block |
||
| 122 | 122 | **/ |
| 123 | 123 | function balise_FORMULAIRE__dist($p) { |
| 124 | 124 | |
| 125 | - // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide. |
|
| 126 | - // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer |
|
| 127 | - if (existe_formulaire($p->nom_champ) === false) { |
|
| 128 | - $p->code = "''"; |
|
| 129 | - $p->interdire_scripts = false; |
|
| 130 | - |
|
| 131 | - return $p; |
|
| 132 | - } |
|
| 133 | - |
|
| 134 | - // sinon renvoyer un code php dynamique |
|
| 135 | - $p = calculer_balise_dynamique($p, $p->nom_champ, []); |
|
| 136 | - |
|
| 137 | - if ( |
|
| 138 | - !test_espace_prive() |
|
| 139 | - and !empty($p->descr['sourcefile']) |
|
| 140 | - and $f = $p->descr['sourcefile'] |
|
| 141 | - and basename(dirname($f)) === 'modeles' |
|
| 142 | - ) { |
|
| 143 | - // un modele est toujours inséré en texte dans son contenant |
|
| 144 | - // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 145 | - // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 146 | - // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 147 | - $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'"; |
|
| 148 | - // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave) |
|
| 149 | - } |
|
| 150 | - return $p; |
|
| 125 | + // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide. |
|
| 126 | + // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer |
|
| 127 | + if (existe_formulaire($p->nom_champ) === false) { |
|
| 128 | + $p->code = "''"; |
|
| 129 | + $p->interdire_scripts = false; |
|
| 130 | + |
|
| 131 | + return $p; |
|
| 132 | + } |
|
| 133 | + |
|
| 134 | + // sinon renvoyer un code php dynamique |
|
| 135 | + $p = calculer_balise_dynamique($p, $p->nom_champ, []); |
|
| 136 | + |
|
| 137 | + if ( |
|
| 138 | + !test_espace_prive() |
|
| 139 | + and !empty($p->descr['sourcefile']) |
|
| 140 | + and $f = $p->descr['sourcefile'] |
|
| 141 | + and basename(dirname($f)) === 'modeles' |
|
| 142 | + ) { |
|
| 143 | + // un modele est toujours inséré en texte dans son contenant |
|
| 144 | + // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 145 | + // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 146 | + // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 147 | + $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'"; |
|
| 148 | + // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave) |
|
| 149 | + } |
|
| 150 | + return $p; |
|
| 151 | 151 | } |
| 152 | 152 | |
| 153 | 153 | /** |
@@ -167,17 +167,17 @@ discard block |
||
| 167 | 167 | * - string : texte à afficher directement |
| 168 | 168 | */ |
| 169 | 169 | function balise_FORMULAIRE__dyn($form, ...$args) { |
| 170 | - $form = existe_formulaire($form); |
|
| 171 | - if (!$form) { |
|
| 172 | - return ''; |
|
| 173 | - } |
|
| 170 | + $form = existe_formulaire($form); |
|
| 171 | + if (!$form) { |
|
| 172 | + return ''; |
|
| 173 | + } |
|
| 174 | 174 | |
| 175 | - $contexte = balise_FORMULAIRE__contexte($form, $args); |
|
| 176 | - if (!is_array($contexte)) { |
|
| 177 | - return $contexte; |
|
| 178 | - } |
|
| 175 | + $contexte = balise_FORMULAIRE__contexte($form, $args); |
|
| 176 | + if (!is_array($contexte)) { |
|
| 177 | + return $contexte; |
|
| 178 | + } |
|
| 179 | 179 | |
| 180 | - return ["formulaires/$form", 3600, $contexte]; |
|
| 180 | + return ["formulaires/$form", 3600, $contexte]; |
|
| 181 | 181 | } |
| 182 | 182 | |
| 183 | 183 | /** |
@@ -191,84 +191,84 @@ discard block |
||
| 191 | 191 | * Contexte d'environnement à envoyer au squelette |
| 192 | 192 | **/ |
| 193 | 193 | function balise_FORMULAIRE__contexte($form, $args) { |
| 194 | - // tester si ce formulaire vient d'etre poste (memes arguments) |
|
| 195 | - // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page |
|
| 196 | - // si poste, on recupere les erreurs |
|
| 197 | - |
|
| 198 | - $je_suis_poste = false; |
|
| 199 | - if ( |
|
| 200 | - $post_form = _request('formulaire_action') |
|
| 201 | - and $post_form == $form |
|
| 202 | - and $p = _request('formulaire_action_args') |
|
| 203 | - and is_array($p = decoder_contexte_ajax($p, $post_form)) |
|
| 204 | - ) { |
|
| 205 | - // enlever le faux attribut de langue masque |
|
| 206 | - array_shift($p); |
|
| 207 | - if (formulaire__identifier($form, $args, $p)) { |
|
| 208 | - $je_suis_poste = true; |
|
| 209 | - } |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - $editable = true; |
|
| 213 | - $erreurs = $post = []; |
|
| 214 | - if ($je_suis_poste) { |
|
| 215 | - $post = traiter_formulaires_dynamiques(true); |
|
| 216 | - $e = "erreurs_$form"; |
|
| 217 | - $erreurs = $post[$e] ?? []; |
|
| 218 | - $editable = "editable_$form"; |
|
| 219 | - $editable = (!isset($post[$e])) |
|
| 220 | - || (is_countable($erreurs) ? count($erreurs) : 0) |
|
| 221 | - || (isset($post[$editable]) && $post[$editable]); |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - $valeurs = formulaire__charger($form, $args, $je_suis_poste); |
|
| 225 | - |
|
| 226 | - // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable |
|
| 227 | - // C'est plus fort qu'editable qui est gere par le squelette |
|
| 228 | - // Idealement $valeur doit etre alors un message explicatif. |
|
| 229 | - if (!is_array($valeurs)) { |
|
| 230 | - return is_string($valeurs) ? $valeurs : ''; |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - // charger peut passer une action si le formulaire ne tourne pas sur self() |
|
| 234 | - // ou une action vide si elle ne sert pas |
|
| 235 | - $action = $valeurs['action'] ?? self('&', true); |
|
| 236 | - // bug IEx : si action finit par / |
|
| 237 | - // IE croit que le <form ... action=../ > est autoferme |
|
| 238 | - if (substr($action, -1) == '/') { |
|
| 239 | - // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un / |
|
| 240 | - $action .= '#'; |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - // recuperer la saisie en cours si erreurs |
|
| 244 | - // seulement si c'est ce formulaire qui est poste |
|
| 245 | - // ou si on le demande explicitement par le parametre _forcer_request = true |
|
| 246 | - $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])); |
|
| 247 | - foreach (array_keys($valeurs) as $champ) { |
|
| 248 | - if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) { |
|
| 249 | - if ($dispo and (($v = _request($champ)) !== null)) { |
|
| 250 | - $valeurs[$champ] = $v; |
|
| 251 | - } |
|
| 252 | - // nettoyer l'url des champs qui vont etre saisis |
|
| 253 | - if ($action) { |
|
| 254 | - $action = parametre_url($action, $champ, ''); |
|
| 255 | - } |
|
| 256 | - // proteger les ' et les " dans les champs que l'on va injecter |
|
| 257 | - $valeurs[$champ] = protege_champ($valeurs[$champ]); |
|
| 258 | - } |
|
| 259 | - } |
|
| 260 | - |
|
| 261 | - if ($action) { |
|
| 262 | - // nettoyer l'url |
|
| 263 | - $action = parametre_url($action, 'formulaire_action', ''); |
|
| 264 | - $action = parametre_url($action, 'formulaire_action_args', ''); |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - /** |
|
| 268 | - * @deprecated 4.0 |
|
| 269 | - * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide |
|
| 270 | - */ |
|
| 271 | - /* |
|
| 194 | + // tester si ce formulaire vient d'etre poste (memes arguments) |
|
| 195 | + // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page |
|
| 196 | + // si poste, on recupere les erreurs |
|
| 197 | + |
|
| 198 | + $je_suis_poste = false; |
|
| 199 | + if ( |
|
| 200 | + $post_form = _request('formulaire_action') |
|
| 201 | + and $post_form == $form |
|
| 202 | + and $p = _request('formulaire_action_args') |
|
| 203 | + and is_array($p = decoder_contexte_ajax($p, $post_form)) |
|
| 204 | + ) { |
|
| 205 | + // enlever le faux attribut de langue masque |
|
| 206 | + array_shift($p); |
|
| 207 | + if (formulaire__identifier($form, $args, $p)) { |
|
| 208 | + $je_suis_poste = true; |
|
| 209 | + } |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + $editable = true; |
|
| 213 | + $erreurs = $post = []; |
|
| 214 | + if ($je_suis_poste) { |
|
| 215 | + $post = traiter_formulaires_dynamiques(true); |
|
| 216 | + $e = "erreurs_$form"; |
|
| 217 | + $erreurs = $post[$e] ?? []; |
|
| 218 | + $editable = "editable_$form"; |
|
| 219 | + $editable = (!isset($post[$e])) |
|
| 220 | + || (is_countable($erreurs) ? count($erreurs) : 0) |
|
| 221 | + || (isset($post[$editable]) && $post[$editable]); |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + $valeurs = formulaire__charger($form, $args, $je_suis_poste); |
|
| 225 | + |
|
| 226 | + // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable |
|
| 227 | + // C'est plus fort qu'editable qui est gere par le squelette |
|
| 228 | + // Idealement $valeur doit etre alors un message explicatif. |
|
| 229 | + if (!is_array($valeurs)) { |
|
| 230 | + return is_string($valeurs) ? $valeurs : ''; |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + // charger peut passer une action si le formulaire ne tourne pas sur self() |
|
| 234 | + // ou une action vide si elle ne sert pas |
|
| 235 | + $action = $valeurs['action'] ?? self('&', true); |
|
| 236 | + // bug IEx : si action finit par / |
|
| 237 | + // IE croit que le <form ... action=../ > est autoferme |
|
| 238 | + if (substr($action, -1) == '/') { |
|
| 239 | + // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un / |
|
| 240 | + $action .= '#'; |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + // recuperer la saisie en cours si erreurs |
|
| 244 | + // seulement si c'est ce formulaire qui est poste |
|
| 245 | + // ou si on le demande explicitement par le parametre _forcer_request = true |
|
| 246 | + $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])); |
|
| 247 | + foreach (array_keys($valeurs) as $champ) { |
|
| 248 | + if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) { |
|
| 249 | + if ($dispo and (($v = _request($champ)) !== null)) { |
|
| 250 | + $valeurs[$champ] = $v; |
|
| 251 | + } |
|
| 252 | + // nettoyer l'url des champs qui vont etre saisis |
|
| 253 | + if ($action) { |
|
| 254 | + $action = parametre_url($action, $champ, ''); |
|
| 255 | + } |
|
| 256 | + // proteger les ' et les " dans les champs que l'on va injecter |
|
| 257 | + $valeurs[$champ] = protege_champ($valeurs[$champ]); |
|
| 258 | + } |
|
| 259 | + } |
|
| 260 | + |
|
| 261 | + if ($action) { |
|
| 262 | + // nettoyer l'url |
|
| 263 | + $action = parametre_url($action, 'formulaire_action', ''); |
|
| 264 | + $action = parametre_url($action, 'formulaire_action_args', ''); |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + /** |
|
| 268 | + * @deprecated 4.0 |
|
| 269 | + * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide |
|
| 270 | + */ |
|
| 271 | + /* |
|
| 272 | 272 | if (isset($valeurs['_action'])) { |
| 273 | 273 | $securiser_action = charger_fonction('securiser_action', 'inc'); |
| 274 | 274 | $secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1); |
@@ -278,59 +278,59 @@ discard block |
||
| 278 | 278 | } |
| 279 | 279 | */ |
| 280 | 280 | |
| 281 | - // empiler la lang en tant que premier argument implicite du CVT |
|
| 282 | - // pour permettre de la restaurer au moment du Verifier et du Traiter |
|
| 283 | - array_unshift($args, $GLOBALS['spip_lang']); |
|
| 284 | - |
|
| 285 | - $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form); |
|
| 286 | - $valeurs['erreurs'] = $erreurs; |
|
| 287 | - $valeurs['action'] = $action; |
|
| 288 | - $valeurs['form'] = $form; |
|
| 289 | - |
|
| 290 | - $valeurs['formulaire_sign'] = ''; |
|
| 291 | - if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 292 | - $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 293 | - $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1); |
|
| 294 | - $valeurs['formulaire_sign'] = $secu['hash']; |
|
| 295 | - } |
|
| 296 | - |
|
| 297 | - if (!isset($valeurs['id'])) { |
|
| 298 | - $valeurs['id'] = 'new'; |
|
| 299 | - } |
|
| 300 | - // editable peut venir de charger() ou de traiter() sinon |
|
| 301 | - if (!isset($valeurs['editable'])) { |
|
| 302 | - $valeurs['editable'] = $editable; |
|
| 303 | - } |
|
| 304 | - // dans tous les cas, renvoyer un espace ou vide (et pas un booleen) |
|
| 305 | - $valeurs['editable'] = ($valeurs['editable'] ? ' ' : ''); |
|
| 306 | - |
|
| 307 | - if ($je_suis_poste) { |
|
| 308 | - $valeurs['message_erreur'] = ''; |
|
| 309 | - if (isset($erreurs['message_erreur'])) { |
|
| 310 | - $valeurs['message_erreur'] = $erreurs['message_erreur']; |
|
| 311 | - } |
|
| 312 | - |
|
| 313 | - $valeurs['message_ok'] = ''; |
|
| 314 | - if (isset($post["message_ok_$form"])) { |
|
| 315 | - $valeurs['message_ok'] = $post["message_ok_$form"]; |
|
| 316 | - } elseif (isset($erreurs['message_ok'])) { |
|
| 317 | - $valeurs['message_ok'] = $erreurs['message_ok']; |
|
| 318 | - } |
|
| 319 | - |
|
| 320 | - // accessibilite : encapsuler toutes les erreurs dans un role='alert' |
|
| 321 | - // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux) |
|
| 322 | - // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ) |
|
| 323 | - if (html5_permis()) { |
|
| 324 | - foreach ($erreurs as $k => $v) { |
|
| 325 | - if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) { |
|
| 326 | - // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form |
|
| 327 | - $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>'; |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - } |
|
| 331 | - } |
|
| 332 | - |
|
| 333 | - return $valeurs; |
|
| 281 | + // empiler la lang en tant que premier argument implicite du CVT |
|
| 282 | + // pour permettre de la restaurer au moment du Verifier et du Traiter |
|
| 283 | + array_unshift($args, $GLOBALS['spip_lang']); |
|
| 284 | + |
|
| 285 | + $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form); |
|
| 286 | + $valeurs['erreurs'] = $erreurs; |
|
| 287 | + $valeurs['action'] = $action; |
|
| 288 | + $valeurs['form'] = $form; |
|
| 289 | + |
|
| 290 | + $valeurs['formulaire_sign'] = ''; |
|
| 291 | + if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 292 | + $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 293 | + $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1); |
|
| 294 | + $valeurs['formulaire_sign'] = $secu['hash']; |
|
| 295 | + } |
|
| 296 | + |
|
| 297 | + if (!isset($valeurs['id'])) { |
|
| 298 | + $valeurs['id'] = 'new'; |
|
| 299 | + } |
|
| 300 | + // editable peut venir de charger() ou de traiter() sinon |
|
| 301 | + if (!isset($valeurs['editable'])) { |
|
| 302 | + $valeurs['editable'] = $editable; |
|
| 303 | + } |
|
| 304 | + // dans tous les cas, renvoyer un espace ou vide (et pas un booleen) |
|
| 305 | + $valeurs['editable'] = ($valeurs['editable'] ? ' ' : ''); |
|
| 306 | + |
|
| 307 | + if ($je_suis_poste) { |
|
| 308 | + $valeurs['message_erreur'] = ''; |
|
| 309 | + if (isset($erreurs['message_erreur'])) { |
|
| 310 | + $valeurs['message_erreur'] = $erreurs['message_erreur']; |
|
| 311 | + } |
|
| 312 | + |
|
| 313 | + $valeurs['message_ok'] = ''; |
|
| 314 | + if (isset($post["message_ok_$form"])) { |
|
| 315 | + $valeurs['message_ok'] = $post["message_ok_$form"]; |
|
| 316 | + } elseif (isset($erreurs['message_ok'])) { |
|
| 317 | + $valeurs['message_ok'] = $erreurs['message_ok']; |
|
| 318 | + } |
|
| 319 | + |
|
| 320 | + // accessibilite : encapsuler toutes les erreurs dans un role='alert' |
|
| 321 | + // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux) |
|
| 322 | + // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ) |
|
| 323 | + if (html5_permis()) { |
|
| 324 | + foreach ($erreurs as $k => $v) { |
|
| 325 | + if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) { |
|
| 326 | + // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form |
|
| 327 | + $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>'; |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + } |
|
| 331 | + } |
|
| 332 | + |
|
| 333 | + return $valeurs; |
|
| 334 | 334 | } |
| 335 | 335 | |
| 336 | 336 | /** |
@@ -342,51 +342,51 @@ discard block |
||
| 342 | 342 | * @return array |
| 343 | 343 | */ |
| 344 | 344 | function formulaire__charger($form, $args, $poste) { |
| 345 | - if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) { |
|
| 346 | - $valeurs = call_user_func_array($charger_valeurs, $args); |
|
| 347 | - } else { |
|
| 348 | - $valeurs = []; |
|
| 349 | - } |
|
| 350 | - |
|
| 351 | - $valeurs = pipeline( |
|
| 352 | - 'formulaire_charger', |
|
| 353 | - [ |
|
| 354 | - 'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], |
|
| 355 | - 'data' => $valeurs |
|
| 356 | - ] |
|
| 357 | - ); |
|
| 358 | - |
|
| 359 | - // prise en charge CVT multi etape |
|
| 360 | - if (is_array($valeurs) and isset($valeurs['_etapes'])) { |
|
| 361 | - include_spip('inc/cvt_multietapes'); |
|
| 362 | - $valeurs = cvtmulti_formulaire_charger_etapes( |
|
| 363 | - ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], |
|
| 364 | - $valeurs |
|
| 365 | - ); |
|
| 366 | - } |
|
| 367 | - |
|
| 368 | - // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline ! |
|
| 369 | - if (is_array($valeurs)) { |
|
| 370 | - if (!isset($valeurs['_pipelines'])) { |
|
| 371 | - $valeurs['_pipelines'] = []; |
|
| 372 | - } |
|
| 373 | - // l'ancien argument _pipeline devient maintenant _pipelines |
|
| 374 | - // reinjectons le vieux _pipeline au debut de _pipelines |
|
| 375 | - if (isset($valeurs['_pipeline'])) { |
|
| 376 | - $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline']; |
|
| 377 | - $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : []; |
|
| 378 | - |
|
| 379 | - $pipelines = [$pipe => $args]; |
|
| 380 | - $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']); |
|
| 381 | - } |
|
| 382 | - |
|
| 383 | - // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire |
|
| 384 | - // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond |
|
| 385 | - // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes) |
|
| 386 | - $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste]; |
|
| 387 | - } |
|
| 388 | - |
|
| 389 | - return $valeurs; |
|
| 345 | + if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) { |
|
| 346 | + $valeurs = call_user_func_array($charger_valeurs, $args); |
|
| 347 | + } else { |
|
| 348 | + $valeurs = []; |
|
| 349 | + } |
|
| 350 | + |
|
| 351 | + $valeurs = pipeline( |
|
| 352 | + 'formulaire_charger', |
|
| 353 | + [ |
|
| 354 | + 'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], |
|
| 355 | + 'data' => $valeurs |
|
| 356 | + ] |
|
| 357 | + ); |
|
| 358 | + |
|
| 359 | + // prise en charge CVT multi etape |
|
| 360 | + if (is_array($valeurs) and isset($valeurs['_etapes'])) { |
|
| 361 | + include_spip('inc/cvt_multietapes'); |
|
| 362 | + $valeurs = cvtmulti_formulaire_charger_etapes( |
|
| 363 | + ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste], |
|
| 364 | + $valeurs |
|
| 365 | + ); |
|
| 366 | + } |
|
| 367 | + |
|
| 368 | + // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline ! |
|
| 369 | + if (is_array($valeurs)) { |
|
| 370 | + if (!isset($valeurs['_pipelines'])) { |
|
| 371 | + $valeurs['_pipelines'] = []; |
|
| 372 | + } |
|
| 373 | + // l'ancien argument _pipeline devient maintenant _pipelines |
|
| 374 | + // reinjectons le vieux _pipeline au debut de _pipelines |
|
| 375 | + if (isset($valeurs['_pipeline'])) { |
|
| 376 | + $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline']; |
|
| 377 | + $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : []; |
|
| 378 | + |
|
| 379 | + $pipelines = [$pipe => $args]; |
|
| 380 | + $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']); |
|
| 381 | + } |
|
| 382 | + |
|
| 383 | + // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire |
|
| 384 | + // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond |
|
| 385 | + // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes) |
|
| 386 | + $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste]; |
|
| 387 | + } |
|
| 388 | + |
|
| 389 | + return $valeurs; |
|
| 390 | 390 | } |
| 391 | 391 | |
| 392 | 392 | /** |
@@ -405,9 +405,9 @@ discard block |
||
| 405 | 405 | * @return bool |
| 406 | 406 | */ |
| 407 | 407 | function formulaire__identifier($form, $args, $p) { |
| 408 | - if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) { |
|
| 409 | - return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p); |
|
| 410 | - } |
|
| 408 | + if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) { |
|
| 409 | + return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p); |
|
| 410 | + } |
|
| 411 | 411 | |
| 412 | - return $args === $p; |
|
| 412 | + return $args === $p; |
|
| 413 | 413 | } |
@@ -975,9 +975,9 @@ |
||
| 975 | 975 | if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
| 976 | 976 | define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
| 977 | 977 | } |
| 978 | - $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; |
|
| 978 | + $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')'; |
|
| 979 | 979 | $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; |
| 980 | - $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; |
|
| 980 | + $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml('._TRAITEMENT_TYPO_SANS_NUMERO.')'; |
|
| 981 | 981 | $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
| 982 | 982 | $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
| 983 | 983 | $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | |
@@ -34,53 +34,53 @@ discard block |
||
| 34 | 34 | * @package SPIP\Core\Compilateur\AST |
| 35 | 35 | */ |
| 36 | 36 | class Contexte { |
| 37 | - /** |
|
| 38 | - * Description du squelette |
|
| 39 | - * |
|
| 40 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 41 | - * |
|
| 42 | - * Peut contenir les index : |
|
| 43 | - * |
|
| 44 | - * - nom : Nom du fichier de cache |
|
| 45 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 46 | - * - sourcefile : Chemin du squelette |
|
| 47 | - * - squelette : Code du squelette |
|
| 48 | - * - id_mere : Identifiant de la boucle parente |
|
| 49 | - * - documents : Pour embed et img dans les textes |
|
| 50 | - * - session : Pour un cache sessionné par auteur |
|
| 51 | - * - niv : Niveau de tabulation |
|
| 52 | - * |
|
| 53 | - * @var array |
|
| 54 | - */ |
|
| 55 | - public $descr = []; |
|
| 56 | - |
|
| 57 | - /** |
|
| 58 | - * Identifiant de la boucle |
|
| 59 | - * |
|
| 60 | - * @var string |
|
| 61 | - */ |
|
| 62 | - public $id_boucle = ''; |
|
| 63 | - |
|
| 64 | - /** |
|
| 65 | - * Numéro de ligne dans le code source du squelette |
|
| 66 | - * |
|
| 67 | - * @var int |
|
| 68 | - */ |
|
| 69 | - public $ligne = 0; |
|
| 70 | - |
|
| 71 | - /** |
|
| 72 | - * Langue d'exécution |
|
| 73 | - * |
|
| 74 | - * @var string |
|
| 75 | - */ |
|
| 76 | - public $lang = ''; |
|
| 77 | - |
|
| 78 | - /** |
|
| 79 | - * Résultat de la compilation: toujours une expression PHP |
|
| 80 | - * |
|
| 81 | - * @var string |
|
| 82 | - */ |
|
| 83 | - public $code = ''; |
|
| 37 | + /** |
|
| 38 | + * Description du squelette |
|
| 39 | + * |
|
| 40 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 41 | + * |
|
| 42 | + * Peut contenir les index : |
|
| 43 | + * |
|
| 44 | + * - nom : Nom du fichier de cache |
|
| 45 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 46 | + * - sourcefile : Chemin du squelette |
|
| 47 | + * - squelette : Code du squelette |
|
| 48 | + * - id_mere : Identifiant de la boucle parente |
|
| 49 | + * - documents : Pour embed et img dans les textes |
|
| 50 | + * - session : Pour un cache sessionné par auteur |
|
| 51 | + * - niv : Niveau de tabulation |
|
| 52 | + * |
|
| 53 | + * @var array |
|
| 54 | + */ |
|
| 55 | + public $descr = []; |
|
| 56 | + |
|
| 57 | + /** |
|
| 58 | + * Identifiant de la boucle |
|
| 59 | + * |
|
| 60 | + * @var string |
|
| 61 | + */ |
|
| 62 | + public $id_boucle = ''; |
|
| 63 | + |
|
| 64 | + /** |
|
| 65 | + * Numéro de ligne dans le code source du squelette |
|
| 66 | + * |
|
| 67 | + * @var int |
|
| 68 | + */ |
|
| 69 | + public $ligne = 0; |
|
| 70 | + |
|
| 71 | + /** |
|
| 72 | + * Langue d'exécution |
|
| 73 | + * |
|
| 74 | + * @var string |
|
| 75 | + */ |
|
| 76 | + public $lang = ''; |
|
| 77 | + |
|
| 78 | + /** |
|
| 79 | + * Résultat de la compilation: toujours une expression PHP |
|
| 80 | + * |
|
| 81 | + * @var string |
|
| 82 | + */ |
|
| 83 | + public $code = ''; |
|
| 84 | 84 | } |
| 85 | 85 | |
| 86 | 86 | |
@@ -90,44 +90,44 @@ discard block |
||
| 90 | 90 | * @package SPIP\Core\Compilateur\AST |
| 91 | 91 | **/ |
| 92 | 92 | class Texte { |
| 93 | - /** |
|
| 94 | - * Type de noeud |
|
| 95 | - * |
|
| 96 | - * @var string |
|
| 97 | - */ |
|
| 98 | - public $type = 'texte'; |
|
| 99 | - |
|
| 100 | - /** |
|
| 101 | - * Le texte |
|
| 102 | - * |
|
| 103 | - * @var string |
|
| 104 | - */ |
|
| 105 | - public $texte; |
|
| 106 | - |
|
| 107 | - /** |
|
| 108 | - * Contenu avant le texte. |
|
| 109 | - * |
|
| 110 | - * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 111 | - * |
|
| 112 | - * @var string|array |
|
| 113 | - */ |
|
| 114 | - public $avant = ''; |
|
| 115 | - |
|
| 116 | - /** |
|
| 117 | - * Contenu après le texte. |
|
| 118 | - * |
|
| 119 | - * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 120 | - * |
|
| 121 | - * @var string|array |
|
| 122 | - */ |
|
| 123 | - public $apres = ''; |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * Numéro de ligne dans le code source du squelette |
|
| 127 | - * |
|
| 128 | - * @var int |
|
| 129 | - */ |
|
| 130 | - public $ligne = 0; |
|
| 93 | + /** |
|
| 94 | + * Type de noeud |
|
| 95 | + * |
|
| 96 | + * @var string |
|
| 97 | + */ |
|
| 98 | + public $type = 'texte'; |
|
| 99 | + |
|
| 100 | + /** |
|
| 101 | + * Le texte |
|
| 102 | + * |
|
| 103 | + * @var string |
|
| 104 | + */ |
|
| 105 | + public $texte; |
|
| 106 | + |
|
| 107 | + /** |
|
| 108 | + * Contenu avant le texte. |
|
| 109 | + * |
|
| 110 | + * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 111 | + * |
|
| 112 | + * @var string|array |
|
| 113 | + */ |
|
| 114 | + public $avant = ''; |
|
| 115 | + |
|
| 116 | + /** |
|
| 117 | + * Contenu après le texte. |
|
| 118 | + * |
|
| 119 | + * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 120 | + * |
|
| 121 | + * @var string|array |
|
| 122 | + */ |
|
| 123 | + public $apres = ''; |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * Numéro de ligne dans le code source du squelette |
|
| 127 | + * |
|
| 128 | + * @var int |
|
| 129 | + */ |
|
| 130 | + public $ligne = 0; |
|
| 131 | 131 | } |
| 132 | 132 | |
| 133 | 133 | /** |
@@ -136,50 +136,50 @@ discard block |
||
| 136 | 136 | * @package SPIP\Core\Compilateur\AST |
| 137 | 137 | **/ |
| 138 | 138 | class Inclure { |
| 139 | - /** |
|
| 140 | - * Type de noeud |
|
| 141 | - * |
|
| 142 | - * @var string |
|
| 143 | - */ |
|
| 144 | - public $type = 'include'; |
|
| 145 | - |
|
| 146 | - /** |
|
| 147 | - * Nom d'un fichier inclu |
|
| 148 | - * |
|
| 149 | - * - Objet Texte si inclusion d'un autre squelette |
|
| 150 | - * - chaîne si inclusion d'un fichier PHP directement |
|
| 151 | - * |
|
| 152 | - * @var string|Texte |
|
| 153 | - */ |
|
| 154 | - public $texte; |
|
| 155 | - |
|
| 156 | - /** |
|
| 157 | - * Inutilisé, propriété générique de l'AST |
|
| 158 | - * |
|
| 159 | - * @var string|array |
|
| 160 | - */ |
|
| 161 | - public $avant = ''; |
|
| 162 | - |
|
| 163 | - /** |
|
| 164 | - * Inutilisé, propriété générique de l'AST |
|
| 165 | - * |
|
| 166 | - * @var string|array |
|
| 167 | - */ |
|
| 168 | - public $apres = ''; |
|
| 169 | - |
|
| 170 | - /** |
|
| 171 | - * Numéro de ligne dans le code source du squelette |
|
| 172 | - * |
|
| 173 | - * @var int |
|
| 174 | - */ |
|
| 175 | - public $ligne = 0; |
|
| 176 | - |
|
| 177 | - /** |
|
| 178 | - * Valeurs des paramètres |
|
| 179 | - * |
|
| 180 | - * @var array |
|
| 181 | - */ |
|
| 182 | - public $param = []; |
|
| 139 | + /** |
|
| 140 | + * Type de noeud |
|
| 141 | + * |
|
| 142 | + * @var string |
|
| 143 | + */ |
|
| 144 | + public $type = 'include'; |
|
| 145 | + |
|
| 146 | + /** |
|
| 147 | + * Nom d'un fichier inclu |
|
| 148 | + * |
|
| 149 | + * - Objet Texte si inclusion d'un autre squelette |
|
| 150 | + * - chaîne si inclusion d'un fichier PHP directement |
|
| 151 | + * |
|
| 152 | + * @var string|Texte |
|
| 153 | + */ |
|
| 154 | + public $texte; |
|
| 155 | + |
|
| 156 | + /** |
|
| 157 | + * Inutilisé, propriété générique de l'AST |
|
| 158 | + * |
|
| 159 | + * @var string|array |
|
| 160 | + */ |
|
| 161 | + public $avant = ''; |
|
| 162 | + |
|
| 163 | + /** |
|
| 164 | + * Inutilisé, propriété générique de l'AST |
|
| 165 | + * |
|
| 166 | + * @var string|array |
|
| 167 | + */ |
|
| 168 | + public $apres = ''; |
|
| 169 | + |
|
| 170 | + /** |
|
| 171 | + * Numéro de ligne dans le code source du squelette |
|
| 172 | + * |
|
| 173 | + * @var int |
|
| 174 | + */ |
|
| 175 | + public $ligne = 0; |
|
| 176 | + |
|
| 177 | + /** |
|
| 178 | + * Valeurs des paramètres |
|
| 179 | + * |
|
| 180 | + * @var array |
|
| 181 | + */ |
|
| 182 | + public $param = []; |
|
| 183 | 183 | } |
| 184 | 184 | |
| 185 | 185 | |
@@ -189,386 +189,386 @@ discard block |
||
| 189 | 189 | * @package SPIP\Core\Compilateur\AST |
| 190 | 190 | **/ |
| 191 | 191 | class Boucle { |
| 192 | - /** |
|
| 193 | - * Type de noeud |
|
| 194 | - * |
|
| 195 | - * @var string |
|
| 196 | - */ |
|
| 197 | - public $type = 'boucle'; |
|
| 198 | - |
|
| 199 | - /** |
|
| 200 | - * Identifiant de la boucle |
|
| 201 | - * |
|
| 202 | - * @var string |
|
| 203 | - */ |
|
| 204 | - public $id_boucle; |
|
| 205 | - |
|
| 206 | - /** |
|
| 207 | - * Identifiant de la boucle parente |
|
| 208 | - * |
|
| 209 | - * @var string |
|
| 210 | - */ |
|
| 211 | - public $id_parent = ''; |
|
| 212 | - |
|
| 213 | - /** |
|
| 214 | - * Partie avant toujours affichee |
|
| 215 | - * |
|
| 216 | - * @var string|array |
|
| 217 | - */ |
|
| 218 | - public $preaff = ''; |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * Partie optionnelle avant |
|
| 222 | - * |
|
| 223 | - * @var string|array |
|
| 224 | - */ |
|
| 225 | - public $avant = ''; |
|
| 226 | - |
|
| 227 | - /** |
|
| 228 | - * Pour chaque élément |
|
| 229 | - * |
|
| 230 | - * @var string|array |
|
| 231 | - */ |
|
| 232 | - public $milieu = ''; |
|
| 233 | - |
|
| 234 | - /** |
|
| 235 | - * Partie optionnelle après |
|
| 236 | - * |
|
| 237 | - * @var string|array |
|
| 238 | - */ |
|
| 239 | - public $apres = ''; |
|
| 240 | - |
|
| 241 | - /** |
|
| 242 | - * Partie alternative, si pas de résultat dans la boucle |
|
| 243 | - * |
|
| 244 | - * @var string|array |
|
| 245 | - */ |
|
| 246 | - public $altern = ''; |
|
| 247 | - |
|
| 248 | - /** |
|
| 249 | - * Partie apres toujours affichee |
|
| 250 | - * |
|
| 251 | - * @var string|array |
|
| 252 | - */ |
|
| 253 | - public $postaff = ''; |
|
| 254 | - |
|
| 255 | - |
|
| 256 | - /** |
|
| 257 | - * La boucle doit-elle sélectionner la langue ? |
|
| 258 | - * |
|
| 259 | - * @var string|null |
|
| 260 | - */ |
|
| 261 | - public $lang_select; |
|
| 262 | - |
|
| 263 | - /** |
|
| 264 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 265 | - * |
|
| 266 | - * @var string|null |
|
| 267 | - */ |
|
| 268 | - public $type_requete; |
|
| 269 | - |
|
| 270 | - /** |
|
| 271 | - * La table est elle optionnelle ? |
|
| 272 | - * |
|
| 273 | - * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente |
|
| 274 | - * |
|
| 275 | - * @var bool |
|
| 276 | - */ |
|
| 277 | - public $table_optionnelle = false; |
|
| 278 | - |
|
| 279 | - /** |
|
| 280 | - * Nom du fichier de connexion |
|
| 281 | - * |
|
| 282 | - * @var string |
|
| 283 | - */ |
|
| 284 | - public $sql_serveur = ''; |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * Paramètres de la boucle |
|
| 288 | - * |
|
| 289 | - * Description des paramètres passés à la boucle, qui servent ensuite |
|
| 290 | - * au calcul des critères |
|
| 291 | - * |
|
| 292 | - * @var array |
|
| 293 | - */ |
|
| 294 | - public $param = []; |
|
| 295 | - |
|
| 296 | - /** |
|
| 297 | - * Critères de la boucle |
|
| 298 | - * |
|
| 299 | - * @var Critere[] |
|
| 300 | - */ |
|
| 301 | - public $criteres = []; |
|
| 302 | - |
|
| 303 | - /** |
|
| 304 | - * Textes insérés entre 2 éléments de boucle (critère inter) |
|
| 305 | - * |
|
| 306 | - * @var string[] |
|
| 307 | - */ |
|
| 308 | - public $separateur = []; |
|
| 309 | - |
|
| 310 | - /** |
|
| 311 | - * Liste des jointures possibles avec cette table |
|
| 312 | - * |
|
| 313 | - * Les jointures par défaut de la table sont complétées en priorité |
|
| 314 | - * des jointures déclarées explicitement sur la boucle |
|
| 315 | - * |
|
| 316 | - * @see base_trouver_table_dist() |
|
| 317 | - * @var array |
|
| 318 | - */ |
|
| 319 | - public $jointures = []; |
|
| 320 | - |
|
| 321 | - /** |
|
| 322 | - * Jointures explicites avec cette table |
|
| 323 | - * |
|
| 324 | - * Ces jointures sont utilisées en priorité par rapport aux jointures |
|
| 325 | - * normales possibles pour retrouver les colonnes demandées extérieures |
|
| 326 | - * à la boucle. |
|
| 327 | - * |
|
| 328 | - * @var string|bool |
|
| 329 | - */ |
|
| 330 | - public $jointures_explicites = false; |
|
| 331 | - |
|
| 332 | - /** |
|
| 333 | - * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index" |
|
| 334 | - * |
|
| 335 | - * @var string|null |
|
| 336 | - */ |
|
| 337 | - public $doublons; |
|
| 338 | - |
|
| 339 | - /** |
|
| 340 | - * Code PHP ajouté au début de chaque itération de boucle. |
|
| 341 | - * |
|
| 342 | - * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}... |
|
| 343 | - * |
|
| 344 | - * @var string |
|
| 345 | - */ |
|
| 346 | - public $partie = ''; |
|
| 347 | - |
|
| 348 | - /** |
|
| 349 | - * Nombre de divisions de la boucle, d'éléments à afficher, |
|
| 350 | - * ou de soustractions d'éléments à faire |
|
| 351 | - * |
|
| 352 | - * Dans les critères limitant le nombre d'éléments affichés |
|
| 353 | - * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties. |
|
| 354 | - * |
|
| 355 | - * @var string |
|
| 356 | - */ |
|
| 357 | - public $total_parties = ''; |
|
| 358 | - |
|
| 359 | - /** |
|
| 360 | - * Code PHP ajouté avant l'itération de boucle. |
|
| 361 | - * |
|
| 362 | - * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b} |
|
| 363 | - * pour initialiser les variables de début et de fin d'itération. |
|
| 364 | - * |
|
| 365 | - * @var string |
|
| 366 | - */ |
|
| 367 | - public $mode_partie = ''; |
|
| 368 | - |
|
| 369 | - /** |
|
| 370 | - * Identifiant d'une boucle qui appelle celle-ci de manière récursive |
|
| 371 | - * |
|
| 372 | - * Si une boucle est appelée de manière récursive quelque part par |
|
| 373 | - * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette |
|
| 374 | - * boucle (identifiant) reçoit dans cette propriété l'identifiant |
|
| 375 | - * de l'appelant (rec) |
|
| 376 | - * |
|
| 377 | - * @var string |
|
| 378 | - */ |
|
| 379 | - public $externe = ''; |
|
| 380 | - |
|
| 381 | - // champs pour la construction de la requete SQL |
|
| 382 | - |
|
| 383 | - /** |
|
| 384 | - * Liste des champs à récupérer par la boucle |
|
| 385 | - * |
|
| 386 | - * Expression 'table.nom_champ' ou calculée 'nom_champ AS x' |
|
| 387 | - * |
|
| 388 | - * @var string[] |
|
| 389 | - */ |
|
| 390 | - public $select = []; |
|
| 391 | - |
|
| 392 | - /** |
|
| 393 | - * Liste des alias / tables SQL utilisées dans la boucle |
|
| 394 | - * |
|
| 395 | - * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira |
|
| 396 | - * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée. |
|
| 397 | - * |
|
| 398 | - * L'index 0 peut définir le type de sources de données de l'itérateur DATA |
|
| 399 | - * |
|
| 400 | - * @var string[] |
|
| 401 | - */ |
|
| 402 | - public $from = []; |
|
| 403 | - |
|
| 404 | - /** |
|
| 405 | - * Liste des alias / type de jointures utilisées dans la boucle |
|
| 406 | - * |
|
| 407 | - * L'index est le nom d'alias (comme pour la propriété $from), et la valeur |
|
| 408 | - * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'. |
|
| 409 | - * |
|
| 410 | - * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER' |
|
| 411 | - * qui sera utilisé par défaut (créant donc un INNER JOIN). |
|
| 412 | - * |
|
| 413 | - * @var string[] |
|
| 414 | - */ |
|
| 415 | - public $from_type = []; |
|
| 416 | - |
|
| 417 | - /** |
|
| 418 | - * Liste des conditions WHERE de la boucle |
|
| 419 | - * |
|
| 420 | - * Permet de restreindre les éléments retournés par une boucle |
|
| 421 | - * en fonctions des conditions transmises dans ce tableau. |
|
| 422 | - * |
|
| 423 | - * Ce tableau peut avoir plusieurs niveaux de profondeur. |
|
| 424 | - * |
|
| 425 | - * Les éléments du premier niveau sont reliés par des AND, donc |
|
| 426 | - * chaque élément ajouté directement au where par |
|
| 427 | - * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'" |
|
| 428 | - * est une condition AND en plus. |
|
| 429 | - * |
|
| 430 | - * Par contre, lorsqu'on indique un tableau, il peut décrire des relations |
|
| 431 | - * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs : |
|
| 432 | - * $expr = array(operateur, val1, val2) |
|
| 433 | - * |
|
| 434 | - * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur |
|
| 435 | - * à réaliser tel que : |
|
| 436 | - * |
|
| 437 | - * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... : |
|
| 438 | - * val1 et val2 sont des champs et valeurs à utiliser dans la comparaison |
|
| 439 | - * suivant cet ordre : "val1 operateur val2". |
|
| 440 | - * Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'"); |
|
| 441 | - * - "'AND'", "'OR'", "'NOT'" : |
|
| 442 | - * dans ce cas val1 et val2 sont également des expressions |
|
| 443 | - * de comparaison complètes, et peuvent être eux-même des tableaux comme $expr |
|
| 444 | - * Exemples : |
|
| 445 | - * $boucle->where[] = array("'OR'", $expr1, $expr2); |
|
| 446 | - * $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT |
|
| 447 | - * |
|
| 448 | - * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) : |
|
| 449 | - * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes |
|
| 450 | - * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3) |
|
| 451 | - * |
|
| 452 | - * @var array |
|
| 453 | - */ |
|
| 454 | - public $where = []; |
|
| 455 | - |
|
| 456 | - public $join = []; |
|
| 457 | - public $having = []; |
|
| 458 | - public $limit = ''; |
|
| 459 | - public $group = []; |
|
| 460 | - public $order = []; |
|
| 461 | - public $default_order = []; |
|
| 462 | - public $date = 'date'; |
|
| 463 | - public $hash = ''; |
|
| 464 | - public $in = ''; |
|
| 465 | - public $sous_requete = false; |
|
| 466 | - |
|
| 467 | - /** |
|
| 468 | - * Code PHP qui sera ajouté en tout début de la fonction de boucle |
|
| 469 | - * |
|
| 470 | - * Il sert à insérer le code calculant une hierarchie |
|
| 471 | - * |
|
| 472 | - * @var string |
|
| 473 | - */ |
|
| 474 | - public $hierarchie = ''; |
|
| 475 | - |
|
| 476 | - // champs pour la construction du corps PHP |
|
| 477 | - |
|
| 478 | - /** |
|
| 479 | - * Description des sources de données de la boucle |
|
| 480 | - * |
|
| 481 | - * Description des données de la boucle issu de trouver_table |
|
| 482 | - * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'. |
|
| 483 | - * |
|
| 484 | - * @see base_trouver_table_dist() |
|
| 485 | - * @var array |
|
| 486 | - */ |
|
| 487 | - public $show = []; |
|
| 488 | - |
|
| 489 | - /** |
|
| 490 | - * Nom de la table SQL principale de la boucle, sans son préfixe |
|
| 491 | - * |
|
| 492 | - * @var string |
|
| 493 | - */ |
|
| 494 | - public $id_table; |
|
| 495 | - |
|
| 496 | - /** |
|
| 497 | - * Nom de la clé primaire de la table SQL principale de la boucle |
|
| 498 | - * |
|
| 499 | - * @var string |
|
| 500 | - */ |
|
| 501 | - public $primary; |
|
| 502 | - |
|
| 503 | - /** |
|
| 504 | - * Code PHP compilé de la boucle |
|
| 505 | - * |
|
| 506 | - * @var string |
|
| 507 | - */ |
|
| 508 | - public $return; |
|
| 509 | - |
|
| 510 | - public $numrows = false; |
|
| 511 | - public $cptrows = false; |
|
| 512 | - |
|
| 513 | - /** |
|
| 514 | - * Description du squelette |
|
| 515 | - * |
|
| 516 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 517 | - * |
|
| 518 | - * Peut contenir les index : |
|
| 519 | - * |
|
| 520 | - * - nom : Nom du fichier de cache |
|
| 521 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 522 | - * - sourcefile : Chemin du squelette |
|
| 523 | - * - squelette : Code du squelette |
|
| 524 | - * - id_mere : Identifiant de la boucle parente |
|
| 525 | - * - documents : Pour embed et img dans les textes |
|
| 526 | - * - session : Pour un cache sessionné par auteur |
|
| 527 | - * - niv : Niveau de tabulation |
|
| 528 | - * |
|
| 529 | - * @var array |
|
| 530 | - */ |
|
| 531 | - public $descr = []; |
|
| 532 | - |
|
| 533 | - /** |
|
| 534 | - * Numéro de ligne dans le code source du squelette |
|
| 535 | - * |
|
| 536 | - * @var int |
|
| 537 | - */ |
|
| 538 | - public $ligne = 0; |
|
| 539 | - |
|
| 540 | - |
|
| 541 | - public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement |
|
| 542 | - |
|
| 543 | - /** |
|
| 544 | - * Type d'itérateur utilisé pour cette boucle |
|
| 545 | - * |
|
| 546 | - * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 547 | - * - 'DATA' pour l'itérateur DATA, ... |
|
| 548 | - * |
|
| 549 | - * @var string |
|
| 550 | - */ |
|
| 551 | - public $iterateur = ''; // type d'iterateur |
|
| 552 | - |
|
| 553 | - /** |
|
| 554 | - * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 555 | - */ |
|
| 556 | - public $debug = []; |
|
| 557 | - |
|
| 558 | - /** |
|
| 559 | - * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 560 | - * notamment si le champ a été trouve dans une boucle parente |
|
| 561 | - * |
|
| 562 | - * Tableau nom du champ => index de boucle |
|
| 563 | - * |
|
| 564 | - * @var array $index_champ |
|
| 565 | - */ |
|
| 566 | - public $index_champ = []; |
|
| 567 | - |
|
| 568 | - // obsoletes, conserves provisoirement pour compatibilite |
|
| 569 | - public $tout = false; |
|
| 570 | - public $plat = false; |
|
| 571 | - public $lien = false; |
|
| 192 | + /** |
|
| 193 | + * Type de noeud |
|
| 194 | + * |
|
| 195 | + * @var string |
|
| 196 | + */ |
|
| 197 | + public $type = 'boucle'; |
|
| 198 | + |
|
| 199 | + /** |
|
| 200 | + * Identifiant de la boucle |
|
| 201 | + * |
|
| 202 | + * @var string |
|
| 203 | + */ |
|
| 204 | + public $id_boucle; |
|
| 205 | + |
|
| 206 | + /** |
|
| 207 | + * Identifiant de la boucle parente |
|
| 208 | + * |
|
| 209 | + * @var string |
|
| 210 | + */ |
|
| 211 | + public $id_parent = ''; |
|
| 212 | + |
|
| 213 | + /** |
|
| 214 | + * Partie avant toujours affichee |
|
| 215 | + * |
|
| 216 | + * @var string|array |
|
| 217 | + */ |
|
| 218 | + public $preaff = ''; |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * Partie optionnelle avant |
|
| 222 | + * |
|
| 223 | + * @var string|array |
|
| 224 | + */ |
|
| 225 | + public $avant = ''; |
|
| 226 | + |
|
| 227 | + /** |
|
| 228 | + * Pour chaque élément |
|
| 229 | + * |
|
| 230 | + * @var string|array |
|
| 231 | + */ |
|
| 232 | + public $milieu = ''; |
|
| 233 | + |
|
| 234 | + /** |
|
| 235 | + * Partie optionnelle après |
|
| 236 | + * |
|
| 237 | + * @var string|array |
|
| 238 | + */ |
|
| 239 | + public $apres = ''; |
|
| 240 | + |
|
| 241 | + /** |
|
| 242 | + * Partie alternative, si pas de résultat dans la boucle |
|
| 243 | + * |
|
| 244 | + * @var string|array |
|
| 245 | + */ |
|
| 246 | + public $altern = ''; |
|
| 247 | + |
|
| 248 | + /** |
|
| 249 | + * Partie apres toujours affichee |
|
| 250 | + * |
|
| 251 | + * @var string|array |
|
| 252 | + */ |
|
| 253 | + public $postaff = ''; |
|
| 254 | + |
|
| 255 | + |
|
| 256 | + /** |
|
| 257 | + * La boucle doit-elle sélectionner la langue ? |
|
| 258 | + * |
|
| 259 | + * @var string|null |
|
| 260 | + */ |
|
| 261 | + public $lang_select; |
|
| 262 | + |
|
| 263 | + /** |
|
| 264 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 265 | + * |
|
| 266 | + * @var string|null |
|
| 267 | + */ |
|
| 268 | + public $type_requete; |
|
| 269 | + |
|
| 270 | + /** |
|
| 271 | + * La table est elle optionnelle ? |
|
| 272 | + * |
|
| 273 | + * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente |
|
| 274 | + * |
|
| 275 | + * @var bool |
|
| 276 | + */ |
|
| 277 | + public $table_optionnelle = false; |
|
| 278 | + |
|
| 279 | + /** |
|
| 280 | + * Nom du fichier de connexion |
|
| 281 | + * |
|
| 282 | + * @var string |
|
| 283 | + */ |
|
| 284 | + public $sql_serveur = ''; |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * Paramètres de la boucle |
|
| 288 | + * |
|
| 289 | + * Description des paramètres passés à la boucle, qui servent ensuite |
|
| 290 | + * au calcul des critères |
|
| 291 | + * |
|
| 292 | + * @var array |
|
| 293 | + */ |
|
| 294 | + public $param = []; |
|
| 295 | + |
|
| 296 | + /** |
|
| 297 | + * Critères de la boucle |
|
| 298 | + * |
|
| 299 | + * @var Critere[] |
|
| 300 | + */ |
|
| 301 | + public $criteres = []; |
|
| 302 | + |
|
| 303 | + /** |
|
| 304 | + * Textes insérés entre 2 éléments de boucle (critère inter) |
|
| 305 | + * |
|
| 306 | + * @var string[] |
|
| 307 | + */ |
|
| 308 | + public $separateur = []; |
|
| 309 | + |
|
| 310 | + /** |
|
| 311 | + * Liste des jointures possibles avec cette table |
|
| 312 | + * |
|
| 313 | + * Les jointures par défaut de la table sont complétées en priorité |
|
| 314 | + * des jointures déclarées explicitement sur la boucle |
|
| 315 | + * |
|
| 316 | + * @see base_trouver_table_dist() |
|
| 317 | + * @var array |
|
| 318 | + */ |
|
| 319 | + public $jointures = []; |
|
| 320 | + |
|
| 321 | + /** |
|
| 322 | + * Jointures explicites avec cette table |
|
| 323 | + * |
|
| 324 | + * Ces jointures sont utilisées en priorité par rapport aux jointures |
|
| 325 | + * normales possibles pour retrouver les colonnes demandées extérieures |
|
| 326 | + * à la boucle. |
|
| 327 | + * |
|
| 328 | + * @var string|bool |
|
| 329 | + */ |
|
| 330 | + public $jointures_explicites = false; |
|
| 331 | + |
|
| 332 | + /** |
|
| 333 | + * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index" |
|
| 334 | + * |
|
| 335 | + * @var string|null |
|
| 336 | + */ |
|
| 337 | + public $doublons; |
|
| 338 | + |
|
| 339 | + /** |
|
| 340 | + * Code PHP ajouté au début de chaque itération de boucle. |
|
| 341 | + * |
|
| 342 | + * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}... |
|
| 343 | + * |
|
| 344 | + * @var string |
|
| 345 | + */ |
|
| 346 | + public $partie = ''; |
|
| 347 | + |
|
| 348 | + /** |
|
| 349 | + * Nombre de divisions de la boucle, d'éléments à afficher, |
|
| 350 | + * ou de soustractions d'éléments à faire |
|
| 351 | + * |
|
| 352 | + * Dans les critères limitant le nombre d'éléments affichés |
|
| 353 | + * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties. |
|
| 354 | + * |
|
| 355 | + * @var string |
|
| 356 | + */ |
|
| 357 | + public $total_parties = ''; |
|
| 358 | + |
|
| 359 | + /** |
|
| 360 | + * Code PHP ajouté avant l'itération de boucle. |
|
| 361 | + * |
|
| 362 | + * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b} |
|
| 363 | + * pour initialiser les variables de début et de fin d'itération. |
|
| 364 | + * |
|
| 365 | + * @var string |
|
| 366 | + */ |
|
| 367 | + public $mode_partie = ''; |
|
| 368 | + |
|
| 369 | + /** |
|
| 370 | + * Identifiant d'une boucle qui appelle celle-ci de manière récursive |
|
| 371 | + * |
|
| 372 | + * Si une boucle est appelée de manière récursive quelque part par |
|
| 373 | + * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette |
|
| 374 | + * boucle (identifiant) reçoit dans cette propriété l'identifiant |
|
| 375 | + * de l'appelant (rec) |
|
| 376 | + * |
|
| 377 | + * @var string |
|
| 378 | + */ |
|
| 379 | + public $externe = ''; |
|
| 380 | + |
|
| 381 | + // champs pour la construction de la requete SQL |
|
| 382 | + |
|
| 383 | + /** |
|
| 384 | + * Liste des champs à récupérer par la boucle |
|
| 385 | + * |
|
| 386 | + * Expression 'table.nom_champ' ou calculée 'nom_champ AS x' |
|
| 387 | + * |
|
| 388 | + * @var string[] |
|
| 389 | + */ |
|
| 390 | + public $select = []; |
|
| 391 | + |
|
| 392 | + /** |
|
| 393 | + * Liste des alias / tables SQL utilisées dans la boucle |
|
| 394 | + * |
|
| 395 | + * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira |
|
| 396 | + * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée. |
|
| 397 | + * |
|
| 398 | + * L'index 0 peut définir le type de sources de données de l'itérateur DATA |
|
| 399 | + * |
|
| 400 | + * @var string[] |
|
| 401 | + */ |
|
| 402 | + public $from = []; |
|
| 403 | + |
|
| 404 | + /** |
|
| 405 | + * Liste des alias / type de jointures utilisées dans la boucle |
|
| 406 | + * |
|
| 407 | + * L'index est le nom d'alias (comme pour la propriété $from), et la valeur |
|
| 408 | + * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'. |
|
| 409 | + * |
|
| 410 | + * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER' |
|
| 411 | + * qui sera utilisé par défaut (créant donc un INNER JOIN). |
|
| 412 | + * |
|
| 413 | + * @var string[] |
|
| 414 | + */ |
|
| 415 | + public $from_type = []; |
|
| 416 | + |
|
| 417 | + /** |
|
| 418 | + * Liste des conditions WHERE de la boucle |
|
| 419 | + * |
|
| 420 | + * Permet de restreindre les éléments retournés par une boucle |
|
| 421 | + * en fonctions des conditions transmises dans ce tableau. |
|
| 422 | + * |
|
| 423 | + * Ce tableau peut avoir plusieurs niveaux de profondeur. |
|
| 424 | + * |
|
| 425 | + * Les éléments du premier niveau sont reliés par des AND, donc |
|
| 426 | + * chaque élément ajouté directement au where par |
|
| 427 | + * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'" |
|
| 428 | + * est une condition AND en plus. |
|
| 429 | + * |
|
| 430 | + * Par contre, lorsqu'on indique un tableau, il peut décrire des relations |
|
| 431 | + * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs : |
|
| 432 | + * $expr = array(operateur, val1, val2) |
|
| 433 | + * |
|
| 434 | + * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur |
|
| 435 | + * à réaliser tel que : |
|
| 436 | + * |
|
| 437 | + * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... : |
|
| 438 | + * val1 et val2 sont des champs et valeurs à utiliser dans la comparaison |
|
| 439 | + * suivant cet ordre : "val1 operateur val2". |
|
| 440 | + * Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'"); |
|
| 441 | + * - "'AND'", "'OR'", "'NOT'" : |
|
| 442 | + * dans ce cas val1 et val2 sont également des expressions |
|
| 443 | + * de comparaison complètes, et peuvent être eux-même des tableaux comme $expr |
|
| 444 | + * Exemples : |
|
| 445 | + * $boucle->where[] = array("'OR'", $expr1, $expr2); |
|
| 446 | + * $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT |
|
| 447 | + * |
|
| 448 | + * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) : |
|
| 449 | + * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes |
|
| 450 | + * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3) |
|
| 451 | + * |
|
| 452 | + * @var array |
|
| 453 | + */ |
|
| 454 | + public $where = []; |
|
| 455 | + |
|
| 456 | + public $join = []; |
|
| 457 | + public $having = []; |
|
| 458 | + public $limit = ''; |
|
| 459 | + public $group = []; |
|
| 460 | + public $order = []; |
|
| 461 | + public $default_order = []; |
|
| 462 | + public $date = 'date'; |
|
| 463 | + public $hash = ''; |
|
| 464 | + public $in = ''; |
|
| 465 | + public $sous_requete = false; |
|
| 466 | + |
|
| 467 | + /** |
|
| 468 | + * Code PHP qui sera ajouté en tout début de la fonction de boucle |
|
| 469 | + * |
|
| 470 | + * Il sert à insérer le code calculant une hierarchie |
|
| 471 | + * |
|
| 472 | + * @var string |
|
| 473 | + */ |
|
| 474 | + public $hierarchie = ''; |
|
| 475 | + |
|
| 476 | + // champs pour la construction du corps PHP |
|
| 477 | + |
|
| 478 | + /** |
|
| 479 | + * Description des sources de données de la boucle |
|
| 480 | + * |
|
| 481 | + * Description des données de la boucle issu de trouver_table |
|
| 482 | + * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'. |
|
| 483 | + * |
|
| 484 | + * @see base_trouver_table_dist() |
|
| 485 | + * @var array |
|
| 486 | + */ |
|
| 487 | + public $show = []; |
|
| 488 | + |
|
| 489 | + /** |
|
| 490 | + * Nom de la table SQL principale de la boucle, sans son préfixe |
|
| 491 | + * |
|
| 492 | + * @var string |
|
| 493 | + */ |
|
| 494 | + public $id_table; |
|
| 495 | + |
|
| 496 | + /** |
|
| 497 | + * Nom de la clé primaire de la table SQL principale de la boucle |
|
| 498 | + * |
|
| 499 | + * @var string |
|
| 500 | + */ |
|
| 501 | + public $primary; |
|
| 502 | + |
|
| 503 | + /** |
|
| 504 | + * Code PHP compilé de la boucle |
|
| 505 | + * |
|
| 506 | + * @var string |
|
| 507 | + */ |
|
| 508 | + public $return; |
|
| 509 | + |
|
| 510 | + public $numrows = false; |
|
| 511 | + public $cptrows = false; |
|
| 512 | + |
|
| 513 | + /** |
|
| 514 | + * Description du squelette |
|
| 515 | + * |
|
| 516 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 517 | + * |
|
| 518 | + * Peut contenir les index : |
|
| 519 | + * |
|
| 520 | + * - nom : Nom du fichier de cache |
|
| 521 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 522 | + * - sourcefile : Chemin du squelette |
|
| 523 | + * - squelette : Code du squelette |
|
| 524 | + * - id_mere : Identifiant de la boucle parente |
|
| 525 | + * - documents : Pour embed et img dans les textes |
|
| 526 | + * - session : Pour un cache sessionné par auteur |
|
| 527 | + * - niv : Niveau de tabulation |
|
| 528 | + * |
|
| 529 | + * @var array |
|
| 530 | + */ |
|
| 531 | + public $descr = []; |
|
| 532 | + |
|
| 533 | + /** |
|
| 534 | + * Numéro de ligne dans le code source du squelette |
|
| 535 | + * |
|
| 536 | + * @var int |
|
| 537 | + */ |
|
| 538 | + public $ligne = 0; |
|
| 539 | + |
|
| 540 | + |
|
| 541 | + public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement |
|
| 542 | + |
|
| 543 | + /** |
|
| 544 | + * Type d'itérateur utilisé pour cette boucle |
|
| 545 | + * |
|
| 546 | + * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 547 | + * - 'DATA' pour l'itérateur DATA, ... |
|
| 548 | + * |
|
| 549 | + * @var string |
|
| 550 | + */ |
|
| 551 | + public $iterateur = ''; // type d'iterateur |
|
| 552 | + |
|
| 553 | + /** |
|
| 554 | + * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 555 | + */ |
|
| 556 | + public $debug = []; |
|
| 557 | + |
|
| 558 | + /** |
|
| 559 | + * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 560 | + * notamment si le champ a été trouve dans une boucle parente |
|
| 561 | + * |
|
| 562 | + * Tableau nom du champ => index de boucle |
|
| 563 | + * |
|
| 564 | + * @var array $index_champ |
|
| 565 | + */ |
|
| 566 | + public $index_champ = []; |
|
| 567 | + |
|
| 568 | + // obsoletes, conserves provisoirement pour compatibilite |
|
| 569 | + public $tout = false; |
|
| 570 | + public $plat = false; |
|
| 571 | + public $lien = false; |
|
| 572 | 572 | } |
| 573 | 573 | |
| 574 | 574 | /** |
@@ -579,56 +579,56 @@ discard block |
||
| 579 | 579 | * @package SPIP\Core\Compilateur\AST |
| 580 | 580 | **/ |
| 581 | 581 | class Critere { |
| 582 | - /** |
|
| 583 | - * Type de noeud |
|
| 584 | - * |
|
| 585 | - * @var string |
|
| 586 | - */ |
|
| 587 | - public $type = 'critere'; |
|
| 588 | - |
|
| 589 | - /** |
|
| 590 | - * Opérateur (>, <, >=, IN, ...) |
|
| 591 | - * |
|
| 592 | - * @var null|string |
|
| 593 | - */ |
|
| 594 | - public $op; |
|
| 595 | - |
|
| 596 | - /** |
|
| 597 | - * Présence d'une négation (truc !op valeur) |
|
| 598 | - * |
|
| 599 | - * @var null|string |
|
| 600 | - */ |
|
| 601 | - public $not; |
|
| 602 | - |
|
| 603 | - /** |
|
| 604 | - * Présence d'une exclusion (!truc op valeur) |
|
| 605 | - * |
|
| 606 | - * @var null|string |
|
| 607 | - */ |
|
| 608 | - public $exclus; |
|
| 609 | - |
|
| 610 | - /** |
|
| 611 | - * Présence d'une condition dans le critère (truc ?) |
|
| 612 | - * |
|
| 613 | - * @var bool |
|
| 614 | - */ |
|
| 615 | - public $cond = false; |
|
| 616 | - |
|
| 617 | - /** |
|
| 618 | - * Paramètres du critère |
|
| 619 | - * - $param[0] : élément avant l'opérateur |
|
| 620 | - * - $param[1..n] : éléments après l'opérateur |
|
| 621 | - * |
|
| 622 | - * @var array |
|
| 623 | - */ |
|
| 624 | - public $param = []; |
|
| 625 | - |
|
| 626 | - /** |
|
| 627 | - * Numéro de ligne dans le code source du squelette |
|
| 628 | - * |
|
| 629 | - * @var int |
|
| 630 | - */ |
|
| 631 | - public $ligne = 0; |
|
| 582 | + /** |
|
| 583 | + * Type de noeud |
|
| 584 | + * |
|
| 585 | + * @var string |
|
| 586 | + */ |
|
| 587 | + public $type = 'critere'; |
|
| 588 | + |
|
| 589 | + /** |
|
| 590 | + * Opérateur (>, <, >=, IN, ...) |
|
| 591 | + * |
|
| 592 | + * @var null|string |
|
| 593 | + */ |
|
| 594 | + public $op; |
|
| 595 | + |
|
| 596 | + /** |
|
| 597 | + * Présence d'une négation (truc !op valeur) |
|
| 598 | + * |
|
| 599 | + * @var null|string |
|
| 600 | + */ |
|
| 601 | + public $not; |
|
| 602 | + |
|
| 603 | + /** |
|
| 604 | + * Présence d'une exclusion (!truc op valeur) |
|
| 605 | + * |
|
| 606 | + * @var null|string |
|
| 607 | + */ |
|
| 608 | + public $exclus; |
|
| 609 | + |
|
| 610 | + /** |
|
| 611 | + * Présence d'une condition dans le critère (truc ?) |
|
| 612 | + * |
|
| 613 | + * @var bool |
|
| 614 | + */ |
|
| 615 | + public $cond = false; |
|
| 616 | + |
|
| 617 | + /** |
|
| 618 | + * Paramètres du critère |
|
| 619 | + * - $param[0] : élément avant l'opérateur |
|
| 620 | + * - $param[1..n] : éléments après l'opérateur |
|
| 621 | + * |
|
| 622 | + * @var array |
|
| 623 | + */ |
|
| 624 | + public $param = []; |
|
| 625 | + |
|
| 626 | + /** |
|
| 627 | + * Numéro de ligne dans le code source du squelette |
|
| 628 | + * |
|
| 629 | + * @var int |
|
| 630 | + */ |
|
| 631 | + public $ligne = 0; |
|
| 632 | 632 | } |
| 633 | 633 | |
| 634 | 634 | /** |
@@ -637,139 +637,139 @@ discard block |
||
| 637 | 637 | * @package SPIP\Core\Compilateur\AST |
| 638 | 638 | **/ |
| 639 | 639 | class Champ { |
| 640 | - /** |
|
| 641 | - * Type de noeud |
|
| 642 | - * |
|
| 643 | - * @var string |
|
| 644 | - */ |
|
| 645 | - public $type = 'champ'; |
|
| 646 | - |
|
| 647 | - /** |
|
| 648 | - * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 649 | - * |
|
| 650 | - * @var string|null |
|
| 651 | - */ |
|
| 652 | - public $nom_champ; |
|
| 653 | - |
|
| 654 | - /** |
|
| 655 | - * Identifiant de la boucle parente si explicité |
|
| 656 | - * |
|
| 657 | - * @var string|null |
|
| 658 | - */ |
|
| 659 | - public $nom_boucle = ''; |
|
| 660 | - |
|
| 661 | - /** |
|
| 662 | - * Partie optionnelle avant |
|
| 663 | - * |
|
| 664 | - * @var null|string|array |
|
| 665 | - */ |
|
| 666 | - public $avant; |
|
| 667 | - |
|
| 668 | - /** |
|
| 669 | - * Partie optionnelle après |
|
| 670 | - * |
|
| 671 | - * @var null|string|array |
|
| 672 | - */ |
|
| 673 | - public $apres; |
|
| 674 | - |
|
| 675 | - /** |
|
| 676 | - * Étoiles : annuler des automatismes |
|
| 677 | - * |
|
| 678 | - * - '*' annule les filtres automatiques |
|
| 679 | - * - '**' annule en plus les protections de scripts |
|
| 680 | - * |
|
| 681 | - * @var null|string |
|
| 682 | - */ |
|
| 683 | - public $etoile; |
|
| 684 | - |
|
| 685 | - /** |
|
| 686 | - * Arguments et filtres explicites sur la balise |
|
| 687 | - * |
|
| 688 | - * - $param[0] contient les arguments de la balise |
|
| 689 | - * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 690 | - * |
|
| 691 | - * @var array |
|
| 692 | - */ |
|
| 693 | - public $param = []; |
|
| 694 | - |
|
| 695 | - /** |
|
| 696 | - * Source des filtres (compatibilité) (?) |
|
| 697 | - * |
|
| 698 | - * @var array|null |
|
| 699 | - */ |
|
| 700 | - public $fonctions = []; |
|
| 701 | - |
|
| 702 | - /** |
|
| 703 | - * Identifiant de la boucle |
|
| 704 | - * |
|
| 705 | - * @var string |
|
| 706 | - */ |
|
| 707 | - public $id_boucle = ''; |
|
| 708 | - |
|
| 709 | - /** |
|
| 710 | - * AST du squelette, liste de toutes les boucles |
|
| 711 | - * |
|
| 712 | - * @var Boucles[] |
|
| 713 | - */ |
|
| 714 | - public $boucles; |
|
| 715 | - |
|
| 716 | - /** |
|
| 717 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 718 | - * |
|
| 719 | - * @var string|null |
|
| 720 | - */ |
|
| 721 | - public $type_requete; |
|
| 722 | - |
|
| 723 | - /** |
|
| 724 | - * Résultat de la compilation: toujours une expression PHP |
|
| 725 | - * |
|
| 726 | - * @var string |
|
| 727 | - */ |
|
| 728 | - public $code = ''; |
|
| 729 | - |
|
| 730 | - /** |
|
| 731 | - * Interdire les scripts |
|
| 732 | - * |
|
| 733 | - * false si on est sûr de cette balise |
|
| 734 | - * |
|
| 735 | - * @see interdire_scripts() |
|
| 736 | - * @var bool |
|
| 737 | - */ |
|
| 738 | - public $interdire_scripts = true; |
|
| 739 | - |
|
| 740 | - /** |
|
| 741 | - * Description du squelette |
|
| 742 | - * |
|
| 743 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 744 | - * |
|
| 745 | - * Peut contenir les index : |
|
| 746 | - * |
|
| 747 | - * - nom : Nom du fichier de cache |
|
| 748 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 749 | - * - sourcefile : Chemin du squelette |
|
| 750 | - * - squelette : Code du squelette |
|
| 751 | - * - id_mere : Identifiant de la boucle parente |
|
| 752 | - * - documents : Pour embed et img dans les textes |
|
| 753 | - * - session : Pour un cache sessionné par auteur |
|
| 754 | - * - niv : Niveau de tabulation |
|
| 755 | - * |
|
| 756 | - * @var array |
|
| 757 | - */ |
|
| 758 | - public $descr = []; |
|
| 759 | - |
|
| 760 | - /** |
|
| 761 | - * Numéro de ligne dans le code source du squelette |
|
| 762 | - * |
|
| 763 | - * @var int |
|
| 764 | - */ |
|
| 765 | - public $ligne = 0; |
|
| 766 | - |
|
| 767 | - /** |
|
| 768 | - * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 769 | - * |
|
| 770 | - * @var bool |
|
| 771 | - */ |
|
| 772 | - public $balise_calculee = false; |
|
| 640 | + /** |
|
| 641 | + * Type de noeud |
|
| 642 | + * |
|
| 643 | + * @var string |
|
| 644 | + */ |
|
| 645 | + public $type = 'champ'; |
|
| 646 | + |
|
| 647 | + /** |
|
| 648 | + * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 649 | + * |
|
| 650 | + * @var string|null |
|
| 651 | + */ |
|
| 652 | + public $nom_champ; |
|
| 653 | + |
|
| 654 | + /** |
|
| 655 | + * Identifiant de la boucle parente si explicité |
|
| 656 | + * |
|
| 657 | + * @var string|null |
|
| 658 | + */ |
|
| 659 | + public $nom_boucle = ''; |
|
| 660 | + |
|
| 661 | + /** |
|
| 662 | + * Partie optionnelle avant |
|
| 663 | + * |
|
| 664 | + * @var null|string|array |
|
| 665 | + */ |
|
| 666 | + public $avant; |
|
| 667 | + |
|
| 668 | + /** |
|
| 669 | + * Partie optionnelle après |
|
| 670 | + * |
|
| 671 | + * @var null|string|array |
|
| 672 | + */ |
|
| 673 | + public $apres; |
|
| 674 | + |
|
| 675 | + /** |
|
| 676 | + * Étoiles : annuler des automatismes |
|
| 677 | + * |
|
| 678 | + * - '*' annule les filtres automatiques |
|
| 679 | + * - '**' annule en plus les protections de scripts |
|
| 680 | + * |
|
| 681 | + * @var null|string |
|
| 682 | + */ |
|
| 683 | + public $etoile; |
|
| 684 | + |
|
| 685 | + /** |
|
| 686 | + * Arguments et filtres explicites sur la balise |
|
| 687 | + * |
|
| 688 | + * - $param[0] contient les arguments de la balise |
|
| 689 | + * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 690 | + * |
|
| 691 | + * @var array |
|
| 692 | + */ |
|
| 693 | + public $param = []; |
|
| 694 | + |
|
| 695 | + /** |
|
| 696 | + * Source des filtres (compatibilité) (?) |
|
| 697 | + * |
|
| 698 | + * @var array|null |
|
| 699 | + */ |
|
| 700 | + public $fonctions = []; |
|
| 701 | + |
|
| 702 | + /** |
|
| 703 | + * Identifiant de la boucle |
|
| 704 | + * |
|
| 705 | + * @var string |
|
| 706 | + */ |
|
| 707 | + public $id_boucle = ''; |
|
| 708 | + |
|
| 709 | + /** |
|
| 710 | + * AST du squelette, liste de toutes les boucles |
|
| 711 | + * |
|
| 712 | + * @var Boucles[] |
|
| 713 | + */ |
|
| 714 | + public $boucles; |
|
| 715 | + |
|
| 716 | + /** |
|
| 717 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 718 | + * |
|
| 719 | + * @var string|null |
|
| 720 | + */ |
|
| 721 | + public $type_requete; |
|
| 722 | + |
|
| 723 | + /** |
|
| 724 | + * Résultat de la compilation: toujours une expression PHP |
|
| 725 | + * |
|
| 726 | + * @var string |
|
| 727 | + */ |
|
| 728 | + public $code = ''; |
|
| 729 | + |
|
| 730 | + /** |
|
| 731 | + * Interdire les scripts |
|
| 732 | + * |
|
| 733 | + * false si on est sûr de cette balise |
|
| 734 | + * |
|
| 735 | + * @see interdire_scripts() |
|
| 736 | + * @var bool |
|
| 737 | + */ |
|
| 738 | + public $interdire_scripts = true; |
|
| 739 | + |
|
| 740 | + /** |
|
| 741 | + * Description du squelette |
|
| 742 | + * |
|
| 743 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 744 | + * |
|
| 745 | + * Peut contenir les index : |
|
| 746 | + * |
|
| 747 | + * - nom : Nom du fichier de cache |
|
| 748 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 749 | + * - sourcefile : Chemin du squelette |
|
| 750 | + * - squelette : Code du squelette |
|
| 751 | + * - id_mere : Identifiant de la boucle parente |
|
| 752 | + * - documents : Pour embed et img dans les textes |
|
| 753 | + * - session : Pour un cache sessionné par auteur |
|
| 754 | + * - niv : Niveau de tabulation |
|
| 755 | + * |
|
| 756 | + * @var array |
|
| 757 | + */ |
|
| 758 | + public $descr = []; |
|
| 759 | + |
|
| 760 | + /** |
|
| 761 | + * Numéro de ligne dans le code source du squelette |
|
| 762 | + * |
|
| 763 | + * @var int |
|
| 764 | + */ |
|
| 765 | + public $ligne = 0; |
|
| 766 | + |
|
| 767 | + /** |
|
| 768 | + * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 769 | + * |
|
| 770 | + * @var bool |
|
| 771 | + */ |
|
| 772 | + public $balise_calculee = false; |
|
| 773 | 773 | } |
| 774 | 774 | |
| 775 | 775 | |
@@ -777,123 +777,123 @@ discard block |
||
| 777 | 777 | * Description d'une chaîne de langue |
| 778 | 778 | **/ |
| 779 | 779 | class Idiome { |
| 780 | - /** |
|
| 781 | - * Type de noeud |
|
| 782 | - * |
|
| 783 | - * @var string |
|
| 784 | - */ |
|
| 785 | - public $type = 'idiome'; |
|
| 786 | - |
|
| 787 | - /** |
|
| 788 | - * Clé de traduction demandée. Exemple 'item_oui' |
|
| 789 | - * |
|
| 790 | - * @var string |
|
| 791 | - */ |
|
| 792 | - public $nom_champ = ''; |
|
| 793 | - |
|
| 794 | - /** |
|
| 795 | - * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 796 | - * |
|
| 797 | - * @var string |
|
| 798 | - */ |
|
| 799 | - public $module = ''; |
|
| 800 | - |
|
| 801 | - /** |
|
| 802 | - * Arguments à passer à la chaîne |
|
| 803 | - * |
|
| 804 | - * @var array |
|
| 805 | - */ |
|
| 806 | - public $arg = []; |
|
| 807 | - |
|
| 808 | - /** |
|
| 809 | - * Filtres à appliquer au résultat |
|
| 810 | - * |
|
| 811 | - * @var array |
|
| 812 | - */ |
|
| 813 | - public $param = []; |
|
| 814 | - |
|
| 815 | - /** |
|
| 816 | - * Source des filtres (compatibilité) (?) |
|
| 817 | - * |
|
| 818 | - * @var array|null |
|
| 819 | - */ |
|
| 820 | - public $fonctions = []; |
|
| 821 | - |
|
| 822 | - /** |
|
| 823 | - * Inutilisé, propriété générique de l'AST |
|
| 824 | - * |
|
| 825 | - * @var string|array |
|
| 826 | - */ |
|
| 827 | - public $avant = ''; |
|
| 828 | - |
|
| 829 | - /** |
|
| 830 | - * Inutilisé, propriété générique de l'AST |
|
| 831 | - * |
|
| 832 | - * @var string|array |
|
| 833 | - */ |
|
| 834 | - public $apres = ''; |
|
| 835 | - |
|
| 836 | - /** |
|
| 837 | - * Identifiant de la boucle |
|
| 838 | - * |
|
| 839 | - * @var string |
|
| 840 | - */ |
|
| 841 | - public $id_boucle = ''; |
|
| 842 | - |
|
| 843 | - /** |
|
| 844 | - * AST du squelette, liste de toutes les boucles |
|
| 845 | - * |
|
| 846 | - * @var Boucles[] |
|
| 847 | - */ |
|
| 848 | - public $boucles; |
|
| 849 | - |
|
| 850 | - /** |
|
| 851 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 852 | - * |
|
| 853 | - * @var string|null |
|
| 854 | - */ |
|
| 855 | - public $type_requete; |
|
| 856 | - |
|
| 857 | - /** |
|
| 858 | - * Résultat de la compilation: toujours une expression PHP |
|
| 859 | - * |
|
| 860 | - * @var string |
|
| 861 | - */ |
|
| 862 | - public $code = ''; |
|
| 863 | - |
|
| 864 | - /** |
|
| 865 | - * Interdire les scripts |
|
| 866 | - * |
|
| 867 | - * @see interdire_scripts() |
|
| 868 | - * @var bool |
|
| 869 | - */ |
|
| 870 | - public $interdire_scripts = false; |
|
| 871 | - |
|
| 872 | - /** |
|
| 873 | - * Description du squelette |
|
| 874 | - * |
|
| 875 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 876 | - * |
|
| 877 | - * Peut contenir les index : |
|
| 878 | - * - nom : Nom du fichier de cache |
|
| 879 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 880 | - * - sourcefile : Chemin du squelette |
|
| 881 | - * - squelette : Code du squelette |
|
| 882 | - * - id_mere : Identifiant de la boucle parente |
|
| 883 | - * - documents : Pour embed et img dans les textes |
|
| 884 | - * - session : Pour un cache sessionné par auteur |
|
| 885 | - * - niv : Niveau de tabulation |
|
| 886 | - * |
|
| 887 | - * @var array |
|
| 888 | - */ |
|
| 889 | - public $descr = []; |
|
| 890 | - |
|
| 891 | - /** |
|
| 892 | - * Numéro de ligne dans le code source du squelette |
|
| 893 | - * |
|
| 894 | - * @var int |
|
| 895 | - */ |
|
| 896 | - public $ligne = 0; |
|
| 780 | + /** |
|
| 781 | + * Type de noeud |
|
| 782 | + * |
|
| 783 | + * @var string |
|
| 784 | + */ |
|
| 785 | + public $type = 'idiome'; |
|
| 786 | + |
|
| 787 | + /** |
|
| 788 | + * Clé de traduction demandée. Exemple 'item_oui' |
|
| 789 | + * |
|
| 790 | + * @var string |
|
| 791 | + */ |
|
| 792 | + public $nom_champ = ''; |
|
| 793 | + |
|
| 794 | + /** |
|
| 795 | + * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 796 | + * |
|
| 797 | + * @var string |
|
| 798 | + */ |
|
| 799 | + public $module = ''; |
|
| 800 | + |
|
| 801 | + /** |
|
| 802 | + * Arguments à passer à la chaîne |
|
| 803 | + * |
|
| 804 | + * @var array |
|
| 805 | + */ |
|
| 806 | + public $arg = []; |
|
| 807 | + |
|
| 808 | + /** |
|
| 809 | + * Filtres à appliquer au résultat |
|
| 810 | + * |
|
| 811 | + * @var array |
|
| 812 | + */ |
|
| 813 | + public $param = []; |
|
| 814 | + |
|
| 815 | + /** |
|
| 816 | + * Source des filtres (compatibilité) (?) |
|
| 817 | + * |
|
| 818 | + * @var array|null |
|
| 819 | + */ |
|
| 820 | + public $fonctions = []; |
|
| 821 | + |
|
| 822 | + /** |
|
| 823 | + * Inutilisé, propriété générique de l'AST |
|
| 824 | + * |
|
| 825 | + * @var string|array |
|
| 826 | + */ |
|
| 827 | + public $avant = ''; |
|
| 828 | + |
|
| 829 | + /** |
|
| 830 | + * Inutilisé, propriété générique de l'AST |
|
| 831 | + * |
|
| 832 | + * @var string|array |
|
| 833 | + */ |
|
| 834 | + public $apres = ''; |
|
| 835 | + |
|
| 836 | + /** |
|
| 837 | + * Identifiant de la boucle |
|
| 838 | + * |
|
| 839 | + * @var string |
|
| 840 | + */ |
|
| 841 | + public $id_boucle = ''; |
|
| 842 | + |
|
| 843 | + /** |
|
| 844 | + * AST du squelette, liste de toutes les boucles |
|
| 845 | + * |
|
| 846 | + * @var Boucles[] |
|
| 847 | + */ |
|
| 848 | + public $boucles; |
|
| 849 | + |
|
| 850 | + /** |
|
| 851 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 852 | + * |
|
| 853 | + * @var string|null |
|
| 854 | + */ |
|
| 855 | + public $type_requete; |
|
| 856 | + |
|
| 857 | + /** |
|
| 858 | + * Résultat de la compilation: toujours une expression PHP |
|
| 859 | + * |
|
| 860 | + * @var string |
|
| 861 | + */ |
|
| 862 | + public $code = ''; |
|
| 863 | + |
|
| 864 | + /** |
|
| 865 | + * Interdire les scripts |
|
| 866 | + * |
|
| 867 | + * @see interdire_scripts() |
|
| 868 | + * @var bool |
|
| 869 | + */ |
|
| 870 | + public $interdire_scripts = false; |
|
| 871 | + |
|
| 872 | + /** |
|
| 873 | + * Description du squelette |
|
| 874 | + * |
|
| 875 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 876 | + * |
|
| 877 | + * Peut contenir les index : |
|
| 878 | + * - nom : Nom du fichier de cache |
|
| 879 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 880 | + * - sourcefile : Chemin du squelette |
|
| 881 | + * - squelette : Code du squelette |
|
| 882 | + * - id_mere : Identifiant de la boucle parente |
|
| 883 | + * - documents : Pour embed et img dans les textes |
|
| 884 | + * - session : Pour un cache sessionné par auteur |
|
| 885 | + * - niv : Niveau de tabulation |
|
| 886 | + * |
|
| 887 | + * @var array |
|
| 888 | + */ |
|
| 889 | + public $descr = []; |
|
| 890 | + |
|
| 891 | + /** |
|
| 892 | + * Numéro de ligne dans le code source du squelette |
|
| 893 | + * |
|
| 894 | + * @var int |
|
| 895 | + */ |
|
| 896 | + public $ligne = 0; |
|
| 897 | 897 | } |
| 898 | 898 | |
| 899 | 899 | /** |
@@ -902,28 +902,28 @@ discard block |
||
| 902 | 902 | * @package SPIP\Core\Compilateur\AST |
| 903 | 903 | **/ |
| 904 | 904 | class Polyglotte { |
| 905 | - /** |
|
| 906 | - * Type de noeud |
|
| 907 | - * |
|
| 908 | - * @var string |
|
| 909 | - */ |
|
| 910 | - public $type = 'polyglotte'; |
|
| 911 | - |
|
| 912 | - /** |
|
| 913 | - * Tableau des traductions possibles classées par langue |
|
| 914 | - * |
|
| 915 | - * Tableau code de langue => texte |
|
| 916 | - * |
|
| 917 | - * @var array |
|
| 918 | - */ |
|
| 919 | - public $traductions = []; |
|
| 920 | - |
|
| 921 | - /** |
|
| 922 | - * Numéro de ligne dans le code source du squelette |
|
| 923 | - * |
|
| 924 | - * @var int |
|
| 925 | - */ |
|
| 926 | - public $ligne = 0; |
|
| 905 | + /** |
|
| 906 | + * Type de noeud |
|
| 907 | + * |
|
| 908 | + * @var string |
|
| 909 | + */ |
|
| 910 | + public $type = 'polyglotte'; |
|
| 911 | + |
|
| 912 | + /** |
|
| 913 | + * Tableau des traductions possibles classées par langue |
|
| 914 | + * |
|
| 915 | + * Tableau code de langue => texte |
|
| 916 | + * |
|
| 917 | + * @var array |
|
| 918 | + */ |
|
| 919 | + public $traductions = []; |
|
| 920 | + |
|
| 921 | + /** |
|
| 922 | + * Numéro de ligne dans le code source du squelette |
|
| 923 | + * |
|
| 924 | + * @var int |
|
| 925 | + */ |
|
| 926 | + public $ligne = 0; |
|
| 927 | 927 | } |
| 928 | 928 | |
| 929 | 929 | |
@@ -948,90 +948,90 @@ discard block |
||
| 948 | 948 | */ |
| 949 | 949 | function declarer_interfaces() { |
| 950 | 950 | |
| 951 | - $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 952 | - $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 953 | - $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 954 | - $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 955 | - |
|
| 956 | - // definition des statuts de publication |
|
| 957 | - $GLOBALS['table_statut'] = []; |
|
| 958 | - |
|
| 959 | - // |
|
| 960 | - // tableau des tables de jointures |
|
| 961 | - // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 962 | - $GLOBALS['tables_jointures'] = []; |
|
| 963 | - $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 964 | - |
|
| 965 | - // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 966 | - $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 967 | - |
|
| 968 | - |
|
| 969 | - if (!defined('_TRAITEMENT_TYPO')) { |
|
| 970 | - define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 971 | - } |
|
| 972 | - if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 973 | - define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 974 | - } |
|
| 975 | - if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 976 | - define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 977 | - } |
|
| 978 | - $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; |
|
| 979 | - $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; |
|
| 980 | - $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; |
|
| 981 | - $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 982 | - $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 983 | - $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 984 | - $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 985 | - $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 986 | - $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 987 | - $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 988 | - $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 989 | - $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 990 | - $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 991 | - $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 992 | - $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 993 | - $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 994 | - $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 995 | - $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 996 | - $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 997 | - $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 998 | - $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 999 | - $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1000 | - $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 1001 | - $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1002 | - |
|
| 1003 | - // valeur par defaut pour les balises non listees ci-dessus |
|
| 1004 | - $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1005 | - // toujours securiser les DATA |
|
| 1006 | - $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1007 | - // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1008 | - $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1009 | - |
|
| 1010 | - |
|
| 1011 | - // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1012 | - $interfaces = pipeline( |
|
| 1013 | - 'declarer_tables_interfaces', |
|
| 1014 | - [ |
|
| 1015 | - 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1016 | - 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1017 | - 'table_date' => $GLOBALS['table_date'], |
|
| 1018 | - 'table_titre' => $GLOBALS['table_titre'], |
|
| 1019 | - 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1020 | - 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1021 | - 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1022 | - 'table_statut' => $GLOBALS['table_statut'], |
|
| 1023 | - ] |
|
| 1024 | - ); |
|
| 1025 | - if ($interfaces) { |
|
| 1026 | - $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1027 | - $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1028 | - $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1029 | - $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1030 | - $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1031 | - $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1032 | - $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1033 | - $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1034 | - } |
|
| 951 | + $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 952 | + $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 953 | + $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 954 | + $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 955 | + |
|
| 956 | + // definition des statuts de publication |
|
| 957 | + $GLOBALS['table_statut'] = []; |
|
| 958 | + |
|
| 959 | + // |
|
| 960 | + // tableau des tables de jointures |
|
| 961 | + // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 962 | + $GLOBALS['tables_jointures'] = []; |
|
| 963 | + $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 964 | + |
|
| 965 | + // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 966 | + $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 967 | + |
|
| 968 | + |
|
| 969 | + if (!defined('_TRAITEMENT_TYPO')) { |
|
| 970 | + define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 971 | + } |
|
| 972 | + if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 973 | + define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 974 | + } |
|
| 975 | + if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 976 | + define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 977 | + } |
|
| 978 | + $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; |
|
| 979 | + $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; |
|
| 980 | + $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; |
|
| 981 | + $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 982 | + $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 983 | + $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 984 | + $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 985 | + $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 986 | + $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 987 | + $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 988 | + $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 989 | + $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 990 | + $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 991 | + $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 992 | + $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 993 | + $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 994 | + $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 995 | + $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 996 | + $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 997 | + $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 998 | + $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 999 | + $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1000 | + $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 1001 | + $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1002 | + |
|
| 1003 | + // valeur par defaut pour les balises non listees ci-dessus |
|
| 1004 | + $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1005 | + // toujours securiser les DATA |
|
| 1006 | + $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1007 | + // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1008 | + $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1009 | + |
|
| 1010 | + |
|
| 1011 | + // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1012 | + $interfaces = pipeline( |
|
| 1013 | + 'declarer_tables_interfaces', |
|
| 1014 | + [ |
|
| 1015 | + 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1016 | + 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1017 | + 'table_date' => $GLOBALS['table_date'], |
|
| 1018 | + 'table_titre' => $GLOBALS['table_titre'], |
|
| 1019 | + 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1020 | + 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1021 | + 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1022 | + 'table_statut' => $GLOBALS['table_statut'], |
|
| 1023 | + ] |
|
| 1024 | + ); |
|
| 1025 | + if ($interfaces) { |
|
| 1026 | + $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1027 | + $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1028 | + $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1029 | + $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1030 | + $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1031 | + $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1032 | + $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1033 | + $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1034 | + } |
|
| 1035 | 1035 | } |
| 1036 | 1036 | |
| 1037 | 1037 | declarer_interfaces(); |
@@ -106,7 +106,7 @@ discard block |
||
| 106 | 106 | ); |
| 107 | 107 | |
| 108 | 108 | // Si l'article est publie, invalider les caches et demander sa reindexation |
| 109 | - $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article)); |
|
| 109 | + $t = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article)); |
|
| 110 | 110 | $invalideur = $indexation = false; |
| 111 | 111 | if ($t == 'publie') { |
| 112 | 112 | $invalideur = "id='article/$id_article'"; |
@@ -119,7 +119,7 @@ discard block |
||
| 119 | 119 | $id_article, |
| 120 | 120 | [ |
| 121 | 121 | 'data' => $set, |
| 122 | - 'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article], |
|
| 122 | + 'nonvide' => ['titre' => _T('info_nouvel_article').' '._T('info_numero_abbreviation').$id_article], |
|
| 123 | 123 | 'invalideur' => $invalideur, |
| 124 | 124 | 'indexation' => $indexation, |
| 125 | 125 | 'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif |
@@ -309,7 +309,7 @@ discard block |
||
| 309 | 309 | } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') { |
| 310 | 310 | $statut = $champs['statut'] = $s; |
| 311 | 311 | } else { |
| 312 | - spip_log("editer_article $id_article refus " . join(' ', $c)); |
|
| 312 | + spip_log("editer_article $id_article refus ".join(' ', $c)); |
|
| 313 | 313 | } |
| 314 | 314 | |
| 315 | 315 | // En cas de publication, fixer la date a "maintenant" |
@@ -334,7 +334,7 @@ discard block |
||
| 334 | 334 | isset($c['id_parent']) |
| 335 | 335 | and $id_parent = $c['id_parent'] |
| 336 | 336 | and $id_parent != $id_rubrique |
| 337 | - and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent))) |
|
| 337 | + and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique='.intval($id_parent))) |
|
| 338 | 338 | ) { |
| 339 | 339 | $champs['id_rubrique'] = $id_parent; |
| 340 | 340 | |
@@ -435,7 +435,7 @@ discard block |
||
| 435 | 435 | // Si on deplace l'article |
| 436 | 436 | // changer aussi son secteur et sa langue (si heritee) |
| 437 | 437 | if (isset($champs['id_rubrique'])) { |
| 438 | - $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique'])); |
|
| 438 | + $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique='.sql_quote($champs['id_rubrique'])); |
|
| 439 | 439 | |
| 440 | 440 | $langue = $row_rub['lang']; |
| 441 | 441 | $champs['id_secteur'] = $row_rub['id_secteur']; |
@@ -443,7 +443,7 @@ discard block |
||
| 443 | 443 | sql_fetsel( |
| 444 | 444 | '1', |
| 445 | 445 | 'spip_articles', |
| 446 | - 'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue) |
|
| 446 | + 'id_article='.intval($id_article)." AND langue_choisie<>'oui' AND lang<>".sql_quote($langue) |
|
| 447 | 447 | ) |
| 448 | 448 | ) { |
| 449 | 449 | $champs['lang'] = $langue; |
@@ -454,7 +454,7 @@ discard block |
||
| 454 | 454 | return; |
| 455 | 455 | } |
| 456 | 456 | |
| 457 | - sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article)); |
|
| 457 | + sql_updateq('spip_articles', $champs, 'id_article='.intval($id_article)); |
|
| 458 | 458 | |
| 459 | 459 | // Changer le statut des rubriques concernees |
| 460 | 460 | |
@@ -475,6 +475,6 @@ discard block |
||
| 475 | 475 | foreach ($plus as $n => $t) { |
| 476 | 476 | $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t); |
| 477 | 477 | } |
| 478 | - set_request('texte', join('', $plus) . _request('texte')); |
|
| 478 | + set_request('texte', join('', $plus)._request('texte')); |
|
| 479 | 479 | } |
| 480 | 480 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | /** |
@@ -40,36 +40,36 @@ discard block |
||
| 40 | 40 | * Liste (identifiant de l'article, Texte d'erreur éventuel) |
| 41 | 41 | */ |
| 42 | 42 | function action_editer_article_dist($arg = null) { |
| 43 | - include_spip('inc/autoriser'); |
|
| 44 | - $err = ''; |
|
| 45 | - if (is_null($arg)) { |
|
| 46 | - $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 47 | - $arg = $securiser_action(); |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - // si id_article n'est pas un nombre, c'est une creation |
|
| 51 | - // mais on verifie qu'on a toutes les donnees qu'il faut. |
|
| 52 | - if (!$id_article = intval($arg)) { |
|
| 53 | - $id_parent = _request('id_parent'); |
|
| 54 | - if (!$id_parent) { |
|
| 55 | - $err = _L("creation interdite d'un article sans rubrique"); |
|
| 56 | - } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) { |
|
| 57 | - $err = _T('info_creerdansrubrique_non_autorise'); |
|
| 58 | - } else { |
|
| 59 | - $id_article = article_inserer($id_parent); |
|
| 60 | - } |
|
| 61 | - } |
|
| 62 | - |
|
| 63 | - // Enregistre l'envoi dans la BD |
|
| 64 | - if ($id_article > 0) { |
|
| 65 | - $err = article_modifier($id_article); |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - if ($err) { |
|
| 69 | - spip_log("echec editeur article: $err", _LOG_ERREUR); |
|
| 70 | - } |
|
| 71 | - |
|
| 72 | - return [$id_article, $err]; |
|
| 43 | + include_spip('inc/autoriser'); |
|
| 44 | + $err = ''; |
|
| 45 | + if (is_null($arg)) { |
|
| 46 | + $securiser_action = charger_fonction('securiser_action', 'inc'); |
|
| 47 | + $arg = $securiser_action(); |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + // si id_article n'est pas un nombre, c'est une creation |
|
| 51 | + // mais on verifie qu'on a toutes les donnees qu'il faut. |
|
| 52 | + if (!$id_article = intval($arg)) { |
|
| 53 | + $id_parent = _request('id_parent'); |
|
| 54 | + if (!$id_parent) { |
|
| 55 | + $err = _L("creation interdite d'un article sans rubrique"); |
|
| 56 | + } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) { |
|
| 57 | + $err = _T('info_creerdansrubrique_non_autorise'); |
|
| 58 | + } else { |
|
| 59 | + $id_article = article_inserer($id_parent); |
|
| 60 | + } |
|
| 61 | + } |
|
| 62 | + |
|
| 63 | + // Enregistre l'envoi dans la BD |
|
| 64 | + if ($id_article > 0) { |
|
| 65 | + $err = article_modifier($id_article); |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + if ($err) { |
|
| 69 | + spip_log("echec editeur article: $err", _LOG_ERREUR); |
|
| 70 | + } |
|
| 71 | + |
|
| 72 | + return [$id_article, $err]; |
|
| 73 | 73 | } |
| 74 | 74 | |
| 75 | 75 | /** |
@@ -91,50 +91,50 @@ discard block |
||
| 91 | 91 | */ |
| 92 | 92 | function article_modifier($id_article, $set = null) { |
| 93 | 93 | |
| 94 | - // unifier $texte en cas de texte trop long |
|
| 95 | - trop_longs_articles(); |
|
| 96 | - |
|
| 97 | - include_spip('inc/modifier'); |
|
| 98 | - include_spip('inc/filtres'); |
|
| 99 | - $c = collecter_requests( |
|
| 100 | - // white list |
|
| 101 | - objet_info('article', 'champs_editables'), |
|
| 102 | - // black list |
|
| 103 | - ['date', 'statut', 'id_parent'], |
|
| 104 | - // donnees eventuellement fournies |
|
| 105 | - $set |
|
| 106 | - ); |
|
| 107 | - |
|
| 108 | - // Si l'article est publie, invalider les caches et demander sa reindexation |
|
| 109 | - $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article)); |
|
| 110 | - $invalideur = $indexation = false; |
|
| 111 | - if ($t == 'publie') { |
|
| 112 | - $invalideur = "id='article/$id_article'"; |
|
| 113 | - $indexation = true; |
|
| 114 | - } |
|
| 115 | - |
|
| 116 | - if ( |
|
| 117 | - $err = objet_modifier_champs( |
|
| 118 | - 'article', |
|
| 119 | - $id_article, |
|
| 120 | - [ |
|
| 121 | - 'data' => $set, |
|
| 122 | - 'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article], |
|
| 123 | - 'invalideur' => $invalideur, |
|
| 124 | - 'indexation' => $indexation, |
|
| 125 | - 'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif |
|
| 126 | - ], |
|
| 127 | - $c |
|
| 128 | - ) |
|
| 129 | - ) { |
|
| 130 | - return $err; |
|
| 131 | - } |
|
| 132 | - |
|
| 133 | - // Modification de statut, changement de rubrique ? |
|
| 134 | - $c = collecter_requests(['date', 'statut', 'id_parent'], [], $set); |
|
| 135 | - $err = article_instituer($id_article, $c); |
|
| 136 | - |
|
| 137 | - return $err; |
|
| 94 | + // unifier $texte en cas de texte trop long |
|
| 95 | + trop_longs_articles(); |
|
| 96 | + |
|
| 97 | + include_spip('inc/modifier'); |
|
| 98 | + include_spip('inc/filtres'); |
|
| 99 | + $c = collecter_requests( |
|
| 100 | + // white list |
|
| 101 | + objet_info('article', 'champs_editables'), |
|
| 102 | + // black list |
|
| 103 | + ['date', 'statut', 'id_parent'], |
|
| 104 | + // donnees eventuellement fournies |
|
| 105 | + $set |
|
| 106 | + ); |
|
| 107 | + |
|
| 108 | + // Si l'article est publie, invalider les caches et demander sa reindexation |
|
| 109 | + $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article)); |
|
| 110 | + $invalideur = $indexation = false; |
|
| 111 | + if ($t == 'publie') { |
|
| 112 | + $invalideur = "id='article/$id_article'"; |
|
| 113 | + $indexation = true; |
|
| 114 | + } |
|
| 115 | + |
|
| 116 | + if ( |
|
| 117 | + $err = objet_modifier_champs( |
|
| 118 | + 'article', |
|
| 119 | + $id_article, |
|
| 120 | + [ |
|
| 121 | + 'data' => $set, |
|
| 122 | + 'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article], |
|
| 123 | + 'invalideur' => $invalideur, |
|
| 124 | + 'indexation' => $indexation, |
|
| 125 | + 'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif |
|
| 126 | + ], |
|
| 127 | + $c |
|
| 128 | + ) |
|
| 129 | + ) { |
|
| 130 | + return $err; |
|
| 131 | + } |
|
| 132 | + |
|
| 133 | + // Modification de statut, changement de rubrique ? |
|
| 134 | + $c = collecter_requests(['date', 'statut', 'id_parent'], [], $set); |
|
| 135 | + $err = article_instituer($id_article, $c); |
|
| 136 | + |
|
| 137 | + return $err; |
|
| 138 | 138 | } |
| 139 | 139 | |
| 140 | 140 | /** |
@@ -170,98 +170,98 @@ discard block |
||
| 170 | 170 | */ |
| 171 | 171 | function article_inserer($id_rubrique, $set = null) { |
| 172 | 172 | |
| 173 | - // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article |
|
| 174 | - // dans la premiere rubrique racine |
|
| 175 | - if (!$id_rubrique = intval($id_rubrique)) { |
|
| 176 | - $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1'); |
|
| 177 | - $id_rubrique = $row['id_rubrique']; |
|
| 178 | - } else { |
|
| 179 | - $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique"); |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue |
|
| 183 | - // cas de id_rubrique = -1 par exemple avec plugin "pages" |
|
| 184 | - $id_secteur = $row['id_secteur'] ?? 0; |
|
| 185 | - $lang_rub = $row['lang'] ?? ''; |
|
| 186 | - |
|
| 187 | - $lang = ''; |
|
| 188 | - $choisie = 'non'; |
|
| 189 | - // La langue a la creation : si les liens de traduction sont autorises |
|
| 190 | - // dans les rubriques, on essaie avec la langue de l'auteur, |
|
| 191 | - // ou a defaut celle de la rubrique |
|
| 192 | - // Sinon c'est la langue de la rubrique qui est choisie + heritee |
|
| 193 | - if ( |
|
| 194 | - !empty($GLOBALS['meta']['multi_objets']) and in_array( |
|
| 195 | - 'spip_articles', |
|
| 196 | - explode(',', $GLOBALS['meta']['multi_objets']) |
|
| 197 | - ) |
|
| 198 | - ) { |
|
| 199 | - lang_select($GLOBALS['visiteur_session']['lang']); |
|
| 200 | - if ( |
|
| 201 | - in_array( |
|
| 202 | - $GLOBALS['spip_lang'], |
|
| 203 | - explode(',', $GLOBALS['meta']['langues_multilingue']) |
|
| 204 | - ) |
|
| 205 | - ) { |
|
| 206 | - $lang = $GLOBALS['spip_lang']; |
|
| 207 | - $choisie = 'oui'; |
|
| 208 | - } |
|
| 209 | - } |
|
| 210 | - |
|
| 211 | - if (!$lang) { |
|
| 212 | - $choisie = 'non'; |
|
| 213 | - $lang = $lang_rub ?: $GLOBALS['meta']['langue_site']; |
|
| 214 | - } |
|
| 215 | - |
|
| 216 | - $champs = [ |
|
| 217 | - 'id_rubrique' => $id_rubrique, |
|
| 218 | - 'id_secteur' => $id_secteur, |
|
| 219 | - 'statut' => 'prepa', |
|
| 220 | - 'date' => date('Y-m-d H:i:s'), |
|
| 221 | - 'lang' => $lang, |
|
| 222 | - 'langue_choisie' => $choisie |
|
| 223 | - ]; |
|
| 224 | - |
|
| 225 | - if ($set) { |
|
| 226 | - $champs = array_merge($champs, $set); |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - // Envoyer aux plugins |
|
| 230 | - $champs = pipeline( |
|
| 231 | - 'pre_insertion', |
|
| 232 | - [ |
|
| 233 | - 'args' => [ |
|
| 234 | - 'table' => 'spip_articles', |
|
| 235 | - ], |
|
| 236 | - 'data' => $champs |
|
| 237 | - ] |
|
| 238 | - ); |
|
| 239 | - |
|
| 240 | - $id_article = sql_insertq('spip_articles', $champs); |
|
| 241 | - |
|
| 242 | - // controler si le serveur n'a pas renvoye une erreur |
|
| 243 | - if ($id_article > 0) { |
|
| 244 | - $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ? |
|
| 245 | - $GLOBALS['visiteur_session']['id_auteur'] |
|
| 246 | - : _request('id_auteur')); |
|
| 247 | - if ($id_auteur) { |
|
| 248 | - include_spip('action/editer_auteur'); |
|
| 249 | - auteur_associer($id_auteur, ['article' => $id_article]); |
|
| 250 | - } |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - pipeline( |
|
| 254 | - 'post_insertion', |
|
| 255 | - [ |
|
| 256 | - 'args' => [ |
|
| 257 | - 'table' => 'spip_articles', |
|
| 258 | - 'id_objet' => $id_article |
|
| 259 | - ], |
|
| 260 | - 'data' => $champs |
|
| 261 | - ] |
|
| 262 | - ); |
|
| 263 | - |
|
| 264 | - return $id_article; |
|
| 173 | + // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article |
|
| 174 | + // dans la premiere rubrique racine |
|
| 175 | + if (!$id_rubrique = intval($id_rubrique)) { |
|
| 176 | + $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1'); |
|
| 177 | + $id_rubrique = $row['id_rubrique']; |
|
| 178 | + } else { |
|
| 179 | + $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique"); |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue |
|
| 183 | + // cas de id_rubrique = -1 par exemple avec plugin "pages" |
|
| 184 | + $id_secteur = $row['id_secteur'] ?? 0; |
|
| 185 | + $lang_rub = $row['lang'] ?? ''; |
|
| 186 | + |
|
| 187 | + $lang = ''; |
|
| 188 | + $choisie = 'non'; |
|
| 189 | + // La langue a la creation : si les liens de traduction sont autorises |
|
| 190 | + // dans les rubriques, on essaie avec la langue de l'auteur, |
|
| 191 | + // ou a defaut celle de la rubrique |
|
| 192 | + // Sinon c'est la langue de la rubrique qui est choisie + heritee |
|
| 193 | + if ( |
|
| 194 | + !empty($GLOBALS['meta']['multi_objets']) and in_array( |
|
| 195 | + 'spip_articles', |
|
| 196 | + explode(',', $GLOBALS['meta']['multi_objets']) |
|
| 197 | + ) |
|
| 198 | + ) { |
|
| 199 | + lang_select($GLOBALS['visiteur_session']['lang']); |
|
| 200 | + if ( |
|
| 201 | + in_array( |
|
| 202 | + $GLOBALS['spip_lang'], |
|
| 203 | + explode(',', $GLOBALS['meta']['langues_multilingue']) |
|
| 204 | + ) |
|
| 205 | + ) { |
|
| 206 | + $lang = $GLOBALS['spip_lang']; |
|
| 207 | + $choisie = 'oui'; |
|
| 208 | + } |
|
| 209 | + } |
|
| 210 | + |
|
| 211 | + if (!$lang) { |
|
| 212 | + $choisie = 'non'; |
|
| 213 | + $lang = $lang_rub ?: $GLOBALS['meta']['langue_site']; |
|
| 214 | + } |
|
| 215 | + |
|
| 216 | + $champs = [ |
|
| 217 | + 'id_rubrique' => $id_rubrique, |
|
| 218 | + 'id_secteur' => $id_secteur, |
|
| 219 | + 'statut' => 'prepa', |
|
| 220 | + 'date' => date('Y-m-d H:i:s'), |
|
| 221 | + 'lang' => $lang, |
|
| 222 | + 'langue_choisie' => $choisie |
|
| 223 | + ]; |
|
| 224 | + |
|
| 225 | + if ($set) { |
|
| 226 | + $champs = array_merge($champs, $set); |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + // Envoyer aux plugins |
|
| 230 | + $champs = pipeline( |
|
| 231 | + 'pre_insertion', |
|
| 232 | + [ |
|
| 233 | + 'args' => [ |
|
| 234 | + 'table' => 'spip_articles', |
|
| 235 | + ], |
|
| 236 | + 'data' => $champs |
|
| 237 | + ] |
|
| 238 | + ); |
|
| 239 | + |
|
| 240 | + $id_article = sql_insertq('spip_articles', $champs); |
|
| 241 | + |
|
| 242 | + // controler si le serveur n'a pas renvoye une erreur |
|
| 243 | + if ($id_article > 0) { |
|
| 244 | + $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ? |
|
| 245 | + $GLOBALS['visiteur_session']['id_auteur'] |
|
| 246 | + : _request('id_auteur')); |
|
| 247 | + if ($id_auteur) { |
|
| 248 | + include_spip('action/editer_auteur'); |
|
| 249 | + auteur_associer($id_auteur, ['article' => $id_article]); |
|
| 250 | + } |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + pipeline( |
|
| 254 | + 'post_insertion', |
|
| 255 | + [ |
|
| 256 | + 'args' => [ |
|
| 257 | + 'table' => 'spip_articles', |
|
| 258 | + 'id_objet' => $id_article |
|
| 259 | + ], |
|
| 260 | + 'data' => $champs |
|
| 261 | + ] |
|
| 262 | + ); |
|
| 263 | + |
|
| 264 | + return $id_article; |
|
| 265 | 265 | } |
| 266 | 266 | |
| 267 | 267 | |
@@ -289,125 +289,125 @@ discard block |
||
| 289 | 289 | */ |
| 290 | 290 | function article_instituer($id_article, $c, $calcul_rub = true) { |
| 291 | 291 | |
| 292 | - include_spip('inc/autoriser'); |
|
| 293 | - include_spip('inc/rubriques'); |
|
| 294 | - include_spip('inc/modifier'); |
|
| 295 | - |
|
| 296 | - $row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article"); |
|
| 297 | - $id_rubrique = $row['id_rubrique']; |
|
| 298 | - $statut_ancien = $statut = $row['statut']; |
|
| 299 | - $date_ancienne = $date = $row['date']; |
|
| 300 | - $champs = []; |
|
| 301 | - |
|
| 302 | - $d = $c['date'] ?? null; |
|
| 303 | - $s = $c['statut'] ?? $statut; |
|
| 304 | - |
|
| 305 | - // cf autorisations dans inc/instituer_article |
|
| 306 | - if ($s != $statut or ($d and $d != $date)) { |
|
| 307 | - if (autoriser('publierdans', 'rubrique', $id_rubrique)) { |
|
| 308 | - $statut = $champs['statut'] = $s; |
|
| 309 | - } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') { |
|
| 310 | - $statut = $champs['statut'] = $s; |
|
| 311 | - } else { |
|
| 312 | - spip_log("editer_article $id_article refus " . join(' ', $c)); |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - // En cas de publication, fixer la date a "maintenant" |
|
| 316 | - // sauf si $c commande autre chose |
|
| 317 | - // ou si l'article est deja date dans le futur |
|
| 318 | - // En cas de proposition d'un article (mais pas depublication), idem |
|
| 319 | - if ( |
|
| 320 | - $champs['statut'] == 'publie' |
|
| 321 | - or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop']))) |
|
| 322 | - ) { |
|
| 323 | - if ($d or strtotime($d = $date) > time()) { |
|
| 324 | - $champs['date'] = $date = $d; |
|
| 325 | - } else { |
|
| 326 | - $champs['date'] = $date = date('Y-m-d H:i:s'); |
|
| 327 | - } |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - |
|
| 331 | - // Verifier que la rubrique demandee existe et est differente |
|
| 332 | - // de la rubrique actuelle |
|
| 333 | - if ( |
|
| 334 | - isset($c['id_parent']) |
|
| 335 | - and $id_parent = $c['id_parent'] |
|
| 336 | - and $id_parent != $id_rubrique |
|
| 337 | - and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent))) |
|
| 338 | - ) { |
|
| 339 | - $champs['id_rubrique'] = $id_parent; |
|
| 340 | - |
|
| 341 | - // si l'article etait publie |
|
| 342 | - // et que le demandeur n'est pas admin de la rubrique de destination |
|
| 343 | - // repasser l'article en statut 'propose'. |
|
| 344 | - if ( |
|
| 345 | - $statut == 'publie' |
|
| 346 | - and !autoriser('publierdans', 'rubrique', $id_parent) |
|
| 347 | - ) { |
|
| 348 | - $champs['statut'] = 'prop'; |
|
| 349 | - } |
|
| 350 | - } |
|
| 351 | - |
|
| 352 | - // Envoyer aux plugins |
|
| 353 | - $champs = pipeline( |
|
| 354 | - 'pre_edition', |
|
| 355 | - [ |
|
| 356 | - 'args' => [ |
|
| 357 | - 'table' => 'spip_articles', |
|
| 358 | - 'id_objet' => $id_article, |
|
| 359 | - 'action' => 'instituer', |
|
| 360 | - 'statut_ancien' => $statut_ancien, |
|
| 361 | - 'date_ancienne' => $date_ancienne, |
|
| 362 | - ], |
|
| 363 | - 'data' => $champs |
|
| 364 | - ] |
|
| 365 | - ); |
|
| 366 | - |
|
| 367 | - if (!(is_countable($champs) ? count($champs) : 0)) { |
|
| 368 | - return ''; |
|
| 369 | - } |
|
| 370 | - |
|
| 371 | - // Envoyer les modifs. |
|
| 372 | - editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub); |
|
| 373 | - |
|
| 374 | - // Invalider les caches |
|
| 375 | - include_spip('inc/invalideur'); |
|
| 376 | - suivre_invalideur("id='article/$id_article'"); |
|
| 377 | - |
|
| 378 | - if ($date) { |
|
| 379 | - $t = strtotime($date); |
|
| 380 | - $p = @$GLOBALS['meta']['date_prochain_postdate']; |
|
| 381 | - if ($t > time() and (!$p or ($t < $p))) { |
|
| 382 | - ecrire_meta('date_prochain_postdate', $t); |
|
| 383 | - } |
|
| 384 | - } |
|
| 385 | - |
|
| 386 | - // Pipeline |
|
| 387 | - pipeline( |
|
| 388 | - 'post_edition', |
|
| 389 | - [ |
|
| 390 | - 'args' => [ |
|
| 391 | - 'table' => 'spip_articles', |
|
| 392 | - 'id_objet' => $id_article, |
|
| 393 | - 'action' => 'instituer', |
|
| 394 | - 'statut_ancien' => $statut_ancien, |
|
| 395 | - 'date_ancienne' => $date_ancienne, |
|
| 396 | - ], |
|
| 397 | - 'data' => $champs |
|
| 398 | - ] |
|
| 399 | - ); |
|
| 400 | - |
|
| 401 | - // Notifications |
|
| 402 | - if ($notifications = charger_fonction('notifications', 'inc')) { |
|
| 403 | - $notifications( |
|
| 404 | - 'instituerarticle', |
|
| 405 | - $id_article, |
|
| 406 | - ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne] |
|
| 407 | - ); |
|
| 408 | - } |
|
| 409 | - |
|
| 410 | - return ''; // pas d'erreur |
|
| 292 | + include_spip('inc/autoriser'); |
|
| 293 | + include_spip('inc/rubriques'); |
|
| 294 | + include_spip('inc/modifier'); |
|
| 295 | + |
|
| 296 | + $row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article"); |
|
| 297 | + $id_rubrique = $row['id_rubrique']; |
|
| 298 | + $statut_ancien = $statut = $row['statut']; |
|
| 299 | + $date_ancienne = $date = $row['date']; |
|
| 300 | + $champs = []; |
|
| 301 | + |
|
| 302 | + $d = $c['date'] ?? null; |
|
| 303 | + $s = $c['statut'] ?? $statut; |
|
| 304 | + |
|
| 305 | + // cf autorisations dans inc/instituer_article |
|
| 306 | + if ($s != $statut or ($d and $d != $date)) { |
|
| 307 | + if (autoriser('publierdans', 'rubrique', $id_rubrique)) { |
|
| 308 | + $statut = $champs['statut'] = $s; |
|
| 309 | + } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') { |
|
| 310 | + $statut = $champs['statut'] = $s; |
|
| 311 | + } else { |
|
| 312 | + spip_log("editer_article $id_article refus " . join(' ', $c)); |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + // En cas de publication, fixer la date a "maintenant" |
|
| 316 | + // sauf si $c commande autre chose |
|
| 317 | + // ou si l'article est deja date dans le futur |
|
| 318 | + // En cas de proposition d'un article (mais pas depublication), idem |
|
| 319 | + if ( |
|
| 320 | + $champs['statut'] == 'publie' |
|
| 321 | + or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop']))) |
|
| 322 | + ) { |
|
| 323 | + if ($d or strtotime($d = $date) > time()) { |
|
| 324 | + $champs['date'] = $date = $d; |
|
| 325 | + } else { |
|
| 326 | + $champs['date'] = $date = date('Y-m-d H:i:s'); |
|
| 327 | + } |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + |
|
| 331 | + // Verifier que la rubrique demandee existe et est differente |
|
| 332 | + // de la rubrique actuelle |
|
| 333 | + if ( |
|
| 334 | + isset($c['id_parent']) |
|
| 335 | + and $id_parent = $c['id_parent'] |
|
| 336 | + and $id_parent != $id_rubrique |
|
| 337 | + and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent))) |
|
| 338 | + ) { |
|
| 339 | + $champs['id_rubrique'] = $id_parent; |
|
| 340 | + |
|
| 341 | + // si l'article etait publie |
|
| 342 | + // et que le demandeur n'est pas admin de la rubrique de destination |
|
| 343 | + // repasser l'article en statut 'propose'. |
|
| 344 | + if ( |
|
| 345 | + $statut == 'publie' |
|
| 346 | + and !autoriser('publierdans', 'rubrique', $id_parent) |
|
| 347 | + ) { |
|
| 348 | + $champs['statut'] = 'prop'; |
|
| 349 | + } |
|
| 350 | + } |
|
| 351 | + |
|
| 352 | + // Envoyer aux plugins |
|
| 353 | + $champs = pipeline( |
|
| 354 | + 'pre_edition', |
|
| 355 | + [ |
|
| 356 | + 'args' => [ |
|
| 357 | + 'table' => 'spip_articles', |
|
| 358 | + 'id_objet' => $id_article, |
|
| 359 | + 'action' => 'instituer', |
|
| 360 | + 'statut_ancien' => $statut_ancien, |
|
| 361 | + 'date_ancienne' => $date_ancienne, |
|
| 362 | + ], |
|
| 363 | + 'data' => $champs |
|
| 364 | + ] |
|
| 365 | + ); |
|
| 366 | + |
|
| 367 | + if (!(is_countable($champs) ? count($champs) : 0)) { |
|
| 368 | + return ''; |
|
| 369 | + } |
|
| 370 | + |
|
| 371 | + // Envoyer les modifs. |
|
| 372 | + editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub); |
|
| 373 | + |
|
| 374 | + // Invalider les caches |
|
| 375 | + include_spip('inc/invalideur'); |
|
| 376 | + suivre_invalideur("id='article/$id_article'"); |
|
| 377 | + |
|
| 378 | + if ($date) { |
|
| 379 | + $t = strtotime($date); |
|
| 380 | + $p = @$GLOBALS['meta']['date_prochain_postdate']; |
|
| 381 | + if ($t > time() and (!$p or ($t < $p))) { |
|
| 382 | + ecrire_meta('date_prochain_postdate', $t); |
|
| 383 | + } |
|
| 384 | + } |
|
| 385 | + |
|
| 386 | + // Pipeline |
|
| 387 | + pipeline( |
|
| 388 | + 'post_edition', |
|
| 389 | + [ |
|
| 390 | + 'args' => [ |
|
| 391 | + 'table' => 'spip_articles', |
|
| 392 | + 'id_objet' => $id_article, |
|
| 393 | + 'action' => 'instituer', |
|
| 394 | + 'statut_ancien' => $statut_ancien, |
|
| 395 | + 'date_ancienne' => $date_ancienne, |
|
| 396 | + ], |
|
| 397 | + 'data' => $champs |
|
| 398 | + ] |
|
| 399 | + ); |
|
| 400 | + |
|
| 401 | + // Notifications |
|
| 402 | + if ($notifications = charger_fonction('notifications', 'inc')) { |
|
| 403 | + $notifications( |
|
| 404 | + 'instituerarticle', |
|
| 405 | + $id_article, |
|
| 406 | + ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne] |
|
| 407 | + ); |
|
| 408 | + } |
|
| 409 | + |
|
| 410 | + return ''; // pas d'erreur |
|
| 411 | 411 | } |
| 412 | 412 | |
| 413 | 413 | /** |
@@ -432,37 +432,37 @@ discard block |
||
| 432 | 432 | */ |
| 433 | 433 | function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond = true) { |
| 434 | 434 | |
| 435 | - // Si on deplace l'article |
|
| 436 | - // changer aussi son secteur et sa langue (si heritee) |
|
| 437 | - if (isset($champs['id_rubrique'])) { |
|
| 438 | - $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique'])); |
|
| 439 | - |
|
| 440 | - $langue = $row_rub['lang']; |
|
| 441 | - $champs['id_secteur'] = $row_rub['id_secteur']; |
|
| 442 | - if ( |
|
| 443 | - sql_fetsel( |
|
| 444 | - '1', |
|
| 445 | - 'spip_articles', |
|
| 446 | - 'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue) |
|
| 447 | - ) |
|
| 448 | - ) { |
|
| 449 | - $champs['lang'] = $langue; |
|
| 450 | - } |
|
| 451 | - } |
|
| 452 | - |
|
| 453 | - if (!$champs) { |
|
| 454 | - return; |
|
| 455 | - } |
|
| 456 | - |
|
| 457 | - sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article)); |
|
| 458 | - |
|
| 459 | - // Changer le statut des rubriques concernees |
|
| 460 | - |
|
| 461 | - if ($cond) { |
|
| 462 | - include_spip('inc/rubriques'); |
|
| 463 | - $postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false; |
|
| 464 | - calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate); |
|
| 465 | - } |
|
| 435 | + // Si on deplace l'article |
|
| 436 | + // changer aussi son secteur et sa langue (si heritee) |
|
| 437 | + if (isset($champs['id_rubrique'])) { |
|
| 438 | + $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique'])); |
|
| 439 | + |
|
| 440 | + $langue = $row_rub['lang']; |
|
| 441 | + $champs['id_secteur'] = $row_rub['id_secteur']; |
|
| 442 | + if ( |
|
| 443 | + sql_fetsel( |
|
| 444 | + '1', |
|
| 445 | + 'spip_articles', |
|
| 446 | + 'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue) |
|
| 447 | + ) |
|
| 448 | + ) { |
|
| 449 | + $champs['lang'] = $langue; |
|
| 450 | + } |
|
| 451 | + } |
|
| 452 | + |
|
| 453 | + if (!$champs) { |
|
| 454 | + return; |
|
| 455 | + } |
|
| 456 | + |
|
| 457 | + sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article)); |
|
| 458 | + |
|
| 459 | + // Changer le statut des rubriques concernees |
|
| 460 | + |
|
| 461 | + if ($cond) { |
|
| 462 | + include_spip('inc/rubriques'); |
|
| 463 | + $postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false; |
|
| 464 | + calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate); |
|
| 465 | + } |
|
| 466 | 466 | } |
| 467 | 467 | |
| 468 | 468 | /** |
@@ -471,10 +471,10 @@ discard block |
||
| 471 | 471 | * @return void |
| 472 | 472 | */ |
| 473 | 473 | function trop_longs_articles() { |
| 474 | - if (is_array($plus = _request('texte_plus'))) { |
|
| 475 | - foreach ($plus as $n => $t) { |
|
| 476 | - $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t); |
|
| 477 | - } |
|
| 478 | - set_request('texte', join('', $plus) . _request('texte')); |
|
| 479 | - } |
|
| 474 | + if (is_array($plus = _request('texte_plus'))) { |
|
| 475 | + foreach ($plus as $n => $t) { |
|
| 476 | + $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t); |
|
| 477 | + } |
|
| 478 | + set_request('texte', join('', $plus) . _request('texte')); |
|
| 479 | + } |
|
| 480 | 480 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | |
@@ -28,210 +28,210 @@ discard block |
||
| 28 | 28 | */ |
| 29 | 29 | class IterateurSQL implements Iterator { |
| 30 | 30 | |
| 31 | - /** |
|
| 32 | - * ressource sql |
|
| 33 | - * |
|
| 34 | - * @var resource|bool |
|
| 35 | - */ |
|
| 36 | - protected $sqlresult = false; |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * row sql courante |
|
| 40 | - * |
|
| 41 | - * @var array|null |
|
| 42 | - */ |
|
| 43 | - protected $row = null; |
|
| 44 | - |
|
| 45 | - protected $firstseek = false; |
|
| 46 | - |
|
| 47 | - /** |
|
| 48 | - * Erreur presente ? |
|
| 49 | - * |
|
| 50 | - * @var bool |
|
| 51 | - **/ |
|
| 52 | - public $err = false; |
|
| 53 | - |
|
| 54 | - /** |
|
| 55 | - * Calcul du total des elements |
|
| 56 | - * |
|
| 57 | - * @var int|null |
|
| 58 | - **/ |
|
| 59 | - public $total = null; |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * selectionner les donnees, ie faire la requete SQL |
|
| 63 | - * |
|
| 64 | - * @return void |
|
| 65 | - */ |
|
| 66 | - protected function select() { |
|
| 67 | - $this->row = null; |
|
| 68 | - $v = &$this->command; |
|
| 69 | - $this->sqlresult = calculer_select( |
|
| 70 | - $v['select'], |
|
| 71 | - $v['from'], |
|
| 72 | - $v['type'], |
|
| 73 | - $v['where'], |
|
| 74 | - $v['join'], |
|
| 75 | - $v['groupby'], |
|
| 76 | - $v['orderby'], |
|
| 77 | - $v['limit'], |
|
| 78 | - $v['having'], |
|
| 79 | - $v['table'], |
|
| 80 | - $v['id'], |
|
| 81 | - $v['connect'], |
|
| 82 | - $this->info |
|
| 83 | - ); |
|
| 84 | - $this->err = !$this->sqlresult; |
|
| 85 | - $this->firstseek = false; |
|
| 86 | - $this->pos = -1; |
|
| 87 | - |
|
| 88 | - // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite) |
|
| 89 | - //$this->total = $this->count(); |
|
| 90 | - } |
|
| 91 | - |
|
| 92 | - /* |
|
| 31 | + /** |
|
| 32 | + * ressource sql |
|
| 33 | + * |
|
| 34 | + * @var resource|bool |
|
| 35 | + */ |
|
| 36 | + protected $sqlresult = false; |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * row sql courante |
|
| 40 | + * |
|
| 41 | + * @var array|null |
|
| 42 | + */ |
|
| 43 | + protected $row = null; |
|
| 44 | + |
|
| 45 | + protected $firstseek = false; |
|
| 46 | + |
|
| 47 | + /** |
|
| 48 | + * Erreur presente ? |
|
| 49 | + * |
|
| 50 | + * @var bool |
|
| 51 | + **/ |
|
| 52 | + public $err = false; |
|
| 53 | + |
|
| 54 | + /** |
|
| 55 | + * Calcul du total des elements |
|
| 56 | + * |
|
| 57 | + * @var int|null |
|
| 58 | + **/ |
|
| 59 | + public $total = null; |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * selectionner les donnees, ie faire la requete SQL |
|
| 63 | + * |
|
| 64 | + * @return void |
|
| 65 | + */ |
|
| 66 | + protected function select() { |
|
| 67 | + $this->row = null; |
|
| 68 | + $v = &$this->command; |
|
| 69 | + $this->sqlresult = calculer_select( |
|
| 70 | + $v['select'], |
|
| 71 | + $v['from'], |
|
| 72 | + $v['type'], |
|
| 73 | + $v['where'], |
|
| 74 | + $v['join'], |
|
| 75 | + $v['groupby'], |
|
| 76 | + $v['orderby'], |
|
| 77 | + $v['limit'], |
|
| 78 | + $v['having'], |
|
| 79 | + $v['table'], |
|
| 80 | + $v['id'], |
|
| 81 | + $v['connect'], |
|
| 82 | + $this->info |
|
| 83 | + ); |
|
| 84 | + $this->err = !$this->sqlresult; |
|
| 85 | + $this->firstseek = false; |
|
| 86 | + $this->pos = -1; |
|
| 87 | + |
|
| 88 | + // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite) |
|
| 89 | + //$this->total = $this->count(); |
|
| 90 | + } |
|
| 91 | + |
|
| 92 | + /* |
|
| 93 | 93 | * array command: les commandes d'initialisation |
| 94 | 94 | * array info: les infos sur le squelette |
| 95 | 95 | */ |
| 96 | - public function __construct($command, $info = []) { |
|
| 97 | - $this->type = 'SQL'; |
|
| 98 | - $this->command = $command; |
|
| 99 | - $this->info = $info; |
|
| 100 | - $this->select(); |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - /** |
|
| 104 | - * Rembobiner |
|
| 105 | - * |
|
| 106 | - * @return bool |
|
| 107 | - */ |
|
| 108 | - public function rewind() : void { |
|
| 109 | - if ($this->pos > 0) { |
|
| 110 | - $this->seek(0); |
|
| 111 | - } |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * Verifier l'etat de l'iterateur |
|
| 116 | - * |
|
| 117 | - * @return bool |
|
| 118 | - */ |
|
| 119 | - public function valid(): bool { |
|
| 120 | - if ($this->err) { |
|
| 121 | - return false; |
|
| 122 | - } |
|
| 123 | - if (!$this->firstseek) { |
|
| 124 | - $this->next(); |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - return is_array($this->row); |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - /** |
|
| 131 | - * Valeurs sur la position courante |
|
| 132 | - * |
|
| 133 | - * @return array |
|
| 134 | - */ |
|
| 135 | - #[\ReturnTypeWillChange] |
|
| 136 | - public function current() { |
|
| 137 | - return $this->row; |
|
| 138 | - } |
|
| 139 | - |
|
| 140 | - #[\ReturnTypeWillChange] |
|
| 141 | - public function key() { |
|
| 142 | - return $this->pos; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - /** |
|
| 146 | - * Sauter a une position absolue |
|
| 147 | - * |
|
| 148 | - * @param int $n |
|
| 149 | - * @param null|string $continue |
|
| 150 | - * @return bool |
|
| 151 | - */ |
|
| 152 | - public function seek($n = 0, $continue = null) { |
|
| 153 | - if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) { |
|
| 154 | - // SQLite ne sait pas seek(), il faut relancer la query |
|
| 155 | - // si la position courante est apres la position visee |
|
| 156 | - // il faut relancer la requete |
|
| 157 | - if ($this->pos > $n) { |
|
| 158 | - $this->free(); |
|
| 159 | - $this->select(); |
|
| 160 | - $this->valid(); |
|
| 161 | - } |
|
| 162 | - // et utiliser la methode par defaut pour se deplacer au bon endroit |
|
| 163 | - // (sera fait en cas d'echec de cette fonction) |
|
| 164 | - return false; |
|
| 165 | - } |
|
| 166 | - $this->row = sql_fetch($this->sqlresult, $this->command['connect']); |
|
| 167 | - $this->pos = min($n, $this->count()); |
|
| 168 | - |
|
| 169 | - return true; |
|
| 170 | - } |
|
| 171 | - |
|
| 172 | - /** |
|
| 173 | - * Avancer d'un cran |
|
| 174 | - * |
|
| 175 | - * @return void |
|
| 176 | - */ |
|
| 177 | - public function next() : void { |
|
| 178 | - $this->row = sql_fetch($this->sqlresult, $this->command['connect']); |
|
| 179 | - $this->pos++; |
|
| 180 | - $this->firstseek |= true; |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - /** |
|
| 184 | - * Avancer et retourner les donnees pour le nouvel element |
|
| 185 | - * |
|
| 186 | - * @return array|bool|null |
|
| 187 | - */ |
|
| 188 | - public function fetch() { |
|
| 189 | - if ($this->valid()) { |
|
| 190 | - $r = $this->current(); |
|
| 191 | - $this->next(); |
|
| 192 | - } else { |
|
| 193 | - $r = false; |
|
| 194 | - } |
|
| 195 | - |
|
| 196 | - return $r; |
|
| 197 | - } |
|
| 198 | - |
|
| 199 | - /** |
|
| 200 | - * liberer les ressources |
|
| 201 | - * |
|
| 202 | - * @return bool |
|
| 203 | - */ |
|
| 204 | - public function free() { |
|
| 205 | - if (!$this->sqlresult) { |
|
| 206 | - return true; |
|
| 207 | - } |
|
| 208 | - $a = sql_free($this->sqlresult, $this->command['connect']); |
|
| 209 | - $this->sqlresult = null; |
|
| 210 | - |
|
| 211 | - return $a; |
|
| 212 | - } |
|
| 213 | - |
|
| 214 | - /** |
|
| 215 | - * Compter le nombre de resultats |
|
| 216 | - * |
|
| 217 | - * @return int |
|
| 218 | - */ |
|
| 219 | - public function count() { |
|
| 220 | - if (is_null($this->total)) { |
|
| 221 | - if (!$this->sqlresult) { |
|
| 222 | - $this->total = 0; |
|
| 223 | - } else { |
|
| 224 | - # cas count(*) |
|
| 225 | - if (in_array('count(*)', $this->command['select'])) { |
|
| 226 | - $this->valid(); |
|
| 227 | - $s = $this->current(); |
|
| 228 | - $this->total = $s['count(*)']; |
|
| 229 | - } else { |
|
| 230 | - $this->total = sql_count($this->sqlresult, $this->command['connect']); |
|
| 231 | - } |
|
| 232 | - } |
|
| 233 | - } |
|
| 234 | - |
|
| 235 | - return $this->total; |
|
| 236 | - } |
|
| 96 | + public function __construct($command, $info = []) { |
|
| 97 | + $this->type = 'SQL'; |
|
| 98 | + $this->command = $command; |
|
| 99 | + $this->info = $info; |
|
| 100 | + $this->select(); |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + /** |
|
| 104 | + * Rembobiner |
|
| 105 | + * |
|
| 106 | + * @return bool |
|
| 107 | + */ |
|
| 108 | + public function rewind() : void { |
|
| 109 | + if ($this->pos > 0) { |
|
| 110 | + $this->seek(0); |
|
| 111 | + } |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * Verifier l'etat de l'iterateur |
|
| 116 | + * |
|
| 117 | + * @return bool |
|
| 118 | + */ |
|
| 119 | + public function valid(): bool { |
|
| 120 | + if ($this->err) { |
|
| 121 | + return false; |
|
| 122 | + } |
|
| 123 | + if (!$this->firstseek) { |
|
| 124 | + $this->next(); |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + return is_array($this->row); |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + /** |
|
| 131 | + * Valeurs sur la position courante |
|
| 132 | + * |
|
| 133 | + * @return array |
|
| 134 | + */ |
|
| 135 | + #[\ReturnTypeWillChange] |
|
| 136 | + public function current() { |
|
| 137 | + return $this->row; |
|
| 138 | + } |
|
| 139 | + |
|
| 140 | + #[\ReturnTypeWillChange] |
|
| 141 | + public function key() { |
|
| 142 | + return $this->pos; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + /** |
|
| 146 | + * Sauter a une position absolue |
|
| 147 | + * |
|
| 148 | + * @param int $n |
|
| 149 | + * @param null|string $continue |
|
| 150 | + * @return bool |
|
| 151 | + */ |
|
| 152 | + public function seek($n = 0, $continue = null) { |
|
| 153 | + if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) { |
|
| 154 | + // SQLite ne sait pas seek(), il faut relancer la query |
|
| 155 | + // si la position courante est apres la position visee |
|
| 156 | + // il faut relancer la requete |
|
| 157 | + if ($this->pos > $n) { |
|
| 158 | + $this->free(); |
|
| 159 | + $this->select(); |
|
| 160 | + $this->valid(); |
|
| 161 | + } |
|
| 162 | + // et utiliser la methode par defaut pour se deplacer au bon endroit |
|
| 163 | + // (sera fait en cas d'echec de cette fonction) |
|
| 164 | + return false; |
|
| 165 | + } |
|
| 166 | + $this->row = sql_fetch($this->sqlresult, $this->command['connect']); |
|
| 167 | + $this->pos = min($n, $this->count()); |
|
| 168 | + |
|
| 169 | + return true; |
|
| 170 | + } |
|
| 171 | + |
|
| 172 | + /** |
|
| 173 | + * Avancer d'un cran |
|
| 174 | + * |
|
| 175 | + * @return void |
|
| 176 | + */ |
|
| 177 | + public function next() : void { |
|
| 178 | + $this->row = sql_fetch($this->sqlresult, $this->command['connect']); |
|
| 179 | + $this->pos++; |
|
| 180 | + $this->firstseek |= true; |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + /** |
|
| 184 | + * Avancer et retourner les donnees pour le nouvel element |
|
| 185 | + * |
|
| 186 | + * @return array|bool|null |
|
| 187 | + */ |
|
| 188 | + public function fetch() { |
|
| 189 | + if ($this->valid()) { |
|
| 190 | + $r = $this->current(); |
|
| 191 | + $this->next(); |
|
| 192 | + } else { |
|
| 193 | + $r = false; |
|
| 194 | + } |
|
| 195 | + |
|
| 196 | + return $r; |
|
| 197 | + } |
|
| 198 | + |
|
| 199 | + /** |
|
| 200 | + * liberer les ressources |
|
| 201 | + * |
|
| 202 | + * @return bool |
|
| 203 | + */ |
|
| 204 | + public function free() { |
|
| 205 | + if (!$this->sqlresult) { |
|
| 206 | + return true; |
|
| 207 | + } |
|
| 208 | + $a = sql_free($this->sqlresult, $this->command['connect']); |
|
| 209 | + $this->sqlresult = null; |
|
| 210 | + |
|
| 211 | + return $a; |
|
| 212 | + } |
|
| 213 | + |
|
| 214 | + /** |
|
| 215 | + * Compter le nombre de resultats |
|
| 216 | + * |
|
| 217 | + * @return int |
|
| 218 | + */ |
|
| 219 | + public function count() { |
|
| 220 | + if (is_null($this->total)) { |
|
| 221 | + if (!$this->sqlresult) { |
|
| 222 | + $this->total = 0; |
|
| 223 | + } else { |
|
| 224 | + # cas count(*) |
|
| 225 | + if (in_array('count(*)', $this->command['select'])) { |
|
| 226 | + $this->valid(); |
|
| 227 | + $s = $this->current(); |
|
| 228 | + $this->total = $s['count(*)']; |
|
| 229 | + } else { |
|
| 230 | + $this->total = sql_count($this->sqlresult, $this->command['connect']); |
|
| 231 | + } |
|
| 232 | + } |
|
| 233 | + } |
|
| 234 | + |
|
| 235 | + return $this->total; |
|
| 236 | + } |
|
| 237 | 237 | } |