@@ -14,57 +14,57 @@ |
||
| 14 | 14 | |
| 15 | 15 | /** Vérification et hachage de mot de passe */ |
| 16 | 16 | class Password { |
| 17 | - /** |
|
| 18 | - * verifier qu'un mot de passe en clair est correct a l'aide de son hash |
|
| 19 | - * |
|
| 20 | - * Le mot de passe est poivre via la cle secret_des_auth |
|
| 21 | - * |
|
| 22 | - * @param string $password_clair |
|
| 23 | - * @param string $password_hash |
|
| 24 | - * @param string $key |
|
| 25 | - * @return bool |
|
| 26 | - */ |
|
| 27 | - public static function verifier( |
|
| 28 | - #[\SensitiveParameter] |
|
| 29 | - string $password_clair, |
|
| 30 | - #[\SensitiveParameter] |
|
| 31 | - string $password_hash, |
|
| 32 | - #[\SensitiveParameter] |
|
| 33 | - ?string $key = null |
|
| 34 | - ): bool { |
|
| 35 | - $key ??= self::getDefaultKey(); |
|
| 36 | - if ($key) { |
|
| 37 | - $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 38 | - return password_verify($pass_poivre, $password_hash); |
|
| 39 | - } |
|
| 40 | - spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 41 | - return false; |
|
| 42 | - } |
|
| 17 | + /** |
|
| 18 | + * verifier qu'un mot de passe en clair est correct a l'aide de son hash |
|
| 19 | + * |
|
| 20 | + * Le mot de passe est poivre via la cle secret_des_auth |
|
| 21 | + * |
|
| 22 | + * @param string $password_clair |
|
| 23 | + * @param string $password_hash |
|
| 24 | + * @param string $key |
|
| 25 | + * @return bool |
|
| 26 | + */ |
|
| 27 | + public static function verifier( |
|
| 28 | + #[\SensitiveParameter] |
|
| 29 | + string $password_clair, |
|
| 30 | + #[\SensitiveParameter] |
|
| 31 | + string $password_hash, |
|
| 32 | + #[\SensitiveParameter] |
|
| 33 | + ?string $key = null |
|
| 34 | + ): bool { |
|
| 35 | + $key ??= self::getDefaultKey(); |
|
| 36 | + if ($key) { |
|
| 37 | + $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 38 | + return password_verify($pass_poivre, $password_hash); |
|
| 39 | + } |
|
| 40 | + spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 41 | + return false; |
|
| 42 | + } |
|
| 43 | 43 | |
| 44 | - /** |
|
| 45 | - * Calculer un hash salé du mot de passe |
|
| 46 | - * @param string $password_clair |
|
| 47 | - * @param string $salt |
|
| 48 | - * @return string |
|
| 49 | - */ |
|
| 50 | - public static function hacher( |
|
| 51 | - #[\SensitiveParameter] |
|
| 52 | - string $password_clair, |
|
| 53 | - #[\SensitiveParameter] |
|
| 54 | - ?string $key = null |
|
| 55 | - ): ?string { |
|
| 56 | - $key ??= self::getDefaultKey(); |
|
| 57 | - // ne pas fournir un hash errone si la cle nous manque |
|
| 58 | - if ($key) { |
|
| 59 | - $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 60 | - return password_hash($pass_poivre, PASSWORD_DEFAULT); |
|
| 61 | - } |
|
| 62 | - spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 63 | - return null; |
|
| 64 | - } |
|
| 44 | + /** |
|
| 45 | + * Calculer un hash salé du mot de passe |
|
| 46 | + * @param string $password_clair |
|
| 47 | + * @param string $salt |
|
| 48 | + * @return string |
|
| 49 | + */ |
|
| 50 | + public static function hacher( |
|
| 51 | + #[\SensitiveParameter] |
|
| 52 | + string $password_clair, |
|
| 53 | + #[\SensitiveParameter] |
|
| 54 | + ?string $key = null |
|
| 55 | + ): ?string { |
|
| 56 | + $key ??= self::getDefaultKey(); |
|
| 57 | + // ne pas fournir un hash errone si la cle nous manque |
|
| 58 | + if ($key) { |
|
| 59 | + $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 60 | + return password_hash($pass_poivre, PASSWORD_DEFAULT); |
|
| 61 | + } |
|
| 62 | + spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 63 | + return null; |
|
| 64 | + } |
|
| 65 | 65 | |
| 66 | - private static function getDefaultKey(): ?string { |
|
| 67 | - $keys = SpipCles::instance(); |
|
| 68 | - return $keys->getSecretAuth(); |
|
| 69 | - } |
|
| 66 | + private static function getDefaultKey(): ?string { |
|
| 67 | + $keys = SpipCles::instance(); |
|
| 68 | + return $keys->getSecretAuth(); |
|
| 69 | + } |
|
| 70 | 70 | } |
@@ -19,15 +19,15 @@ |
||
| 19 | 19 | * @package SPIP\Core\SQL\Upgrade |
| 20 | 20 | **/ |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | $GLOBALS['maj'][2021_02_18_00] = [ |
| 26 | - ['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL" ], |
|
| 27 | - ['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL" ], |
|
| 26 | + ['sql_alter', "TABLE spip_auteurs CHANGE imessage imessage VARCHAR(3) DEFAULT '' NOT NULL" ], |
|
| 27 | + ['sql_updateq', 'spip_auteurs', ['imessage' => 'oui'], "imessage != 'non' OR imessage IS NULL" ], |
|
| 28 | 28 | ]; |
| 29 | 29 | |
| 30 | 30 | $GLOBALS['maj'][2022_02_23_02] = [ |
| 31 | - ['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL" ], |
|
| 32 | - ['sql_delete', 'spip_meta', "nom='secret_du_site'" ], |
|
| 31 | + ['sql_alter', "TABLE spip_auteurs ADD backup_cles mediumtext DEFAULT '' NOT NULL" ], |
|
| 32 | + ['sql_delete', 'spip_meta', "nom='secret_du_site'" ], |
|
| 33 | 33 | ]; |
@@ -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,392 +189,392 @@ 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 | - /** |
|
| 542 | - * table pour stocker les modificateurs de boucle tels que tout, plat ..., |
|
| 543 | - * utilisable par les plugins egalement |
|
| 544 | - * |
|
| 545 | - * @var array<string, mixed> |
|
| 546 | - */ |
|
| 547 | - public $modificateur = []; |
|
| 548 | - |
|
| 549 | - /** |
|
| 550 | - * Type d'itérateur utilisé pour cette boucle |
|
| 551 | - * |
|
| 552 | - * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 553 | - * - 'DATA' pour l'itérateur DATA, ... |
|
| 554 | - * |
|
| 555 | - * @var string |
|
| 556 | - */ |
|
| 557 | - public $iterateur = ''; // type d'iterateur |
|
| 558 | - |
|
| 559 | - /** |
|
| 560 | - * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 561 | - */ |
|
| 562 | - public $debug = []; |
|
| 563 | - |
|
| 564 | - /** |
|
| 565 | - * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 566 | - * notamment si le champ a été trouve dans une boucle parente |
|
| 567 | - * |
|
| 568 | - * Tableau nom du champ => index de boucle |
|
| 569 | - * |
|
| 570 | - * @var array $index_champ |
|
| 571 | - */ |
|
| 572 | - public $index_champ = []; |
|
| 573 | - |
|
| 574 | - // obsoletes, conserves provisoirement pour compatibilite |
|
| 575 | - public $tout = false; |
|
| 576 | - public $plat = false; |
|
| 577 | - 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 | + /** |
|
| 542 | + * table pour stocker les modificateurs de boucle tels que tout, plat ..., |
|
| 543 | + * utilisable par les plugins egalement |
|
| 544 | + * |
|
| 545 | + * @var array<string, mixed> |
|
| 546 | + */ |
|
| 547 | + public $modificateur = []; |
|
| 548 | + |
|
| 549 | + /** |
|
| 550 | + * Type d'itérateur utilisé pour cette boucle |
|
| 551 | + * |
|
| 552 | + * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 553 | + * - 'DATA' pour l'itérateur DATA, ... |
|
| 554 | + * |
|
| 555 | + * @var string |
|
| 556 | + */ |
|
| 557 | + public $iterateur = ''; // type d'iterateur |
|
| 558 | + |
|
| 559 | + /** |
|
| 560 | + * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 561 | + */ |
|
| 562 | + public $debug = []; |
|
| 563 | + |
|
| 564 | + /** |
|
| 565 | + * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 566 | + * notamment si le champ a été trouve dans une boucle parente |
|
| 567 | + * |
|
| 568 | + * Tableau nom du champ => index de boucle |
|
| 569 | + * |
|
| 570 | + * @var array $index_champ |
|
| 571 | + */ |
|
| 572 | + public $index_champ = []; |
|
| 573 | + |
|
| 574 | + // obsoletes, conserves provisoirement pour compatibilite |
|
| 575 | + public $tout = false; |
|
| 576 | + public $plat = false; |
|
| 577 | + public $lien = false; |
|
| 578 | 578 | } |
| 579 | 579 | |
| 580 | 580 | /** |
@@ -585,56 +585,56 @@ discard block |
||
| 585 | 585 | * @package SPIP\Core\Compilateur\AST |
| 586 | 586 | **/ |
| 587 | 587 | class Critere { |
| 588 | - /** |
|
| 589 | - * Type de noeud |
|
| 590 | - * |
|
| 591 | - * @var string |
|
| 592 | - */ |
|
| 593 | - public $type = 'critere'; |
|
| 594 | - |
|
| 595 | - /** |
|
| 596 | - * Opérateur (>, <, >=, IN, ...) |
|
| 597 | - * |
|
| 598 | - * @var null|string |
|
| 599 | - */ |
|
| 600 | - public $op; |
|
| 601 | - |
|
| 602 | - /** |
|
| 603 | - * Présence d'une négation (truc !op valeur) |
|
| 604 | - * |
|
| 605 | - * @var null|string |
|
| 606 | - */ |
|
| 607 | - public $not; |
|
| 608 | - |
|
| 609 | - /** |
|
| 610 | - * Présence d'une exclusion (!truc op valeur) |
|
| 611 | - * |
|
| 612 | - * @var null|string |
|
| 613 | - */ |
|
| 614 | - public $exclus; |
|
| 615 | - |
|
| 616 | - /** |
|
| 617 | - * Présence d'une condition dans le critère (truc ?) |
|
| 618 | - * |
|
| 619 | - * @var bool |
|
| 620 | - */ |
|
| 621 | - public $cond = false; |
|
| 622 | - |
|
| 623 | - /** |
|
| 624 | - * Paramètres du critère |
|
| 625 | - * - $param[0] : élément avant l'opérateur |
|
| 626 | - * - $param[1..n] : éléments après l'opérateur |
|
| 627 | - * |
|
| 628 | - * @var array |
|
| 629 | - */ |
|
| 630 | - public $param = []; |
|
| 631 | - |
|
| 632 | - /** |
|
| 633 | - * Numéro de ligne dans le code source du squelette |
|
| 634 | - * |
|
| 635 | - * @var int |
|
| 636 | - */ |
|
| 637 | - public $ligne = 0; |
|
| 588 | + /** |
|
| 589 | + * Type de noeud |
|
| 590 | + * |
|
| 591 | + * @var string |
|
| 592 | + */ |
|
| 593 | + public $type = 'critere'; |
|
| 594 | + |
|
| 595 | + /** |
|
| 596 | + * Opérateur (>, <, >=, IN, ...) |
|
| 597 | + * |
|
| 598 | + * @var null|string |
|
| 599 | + */ |
|
| 600 | + public $op; |
|
| 601 | + |
|
| 602 | + /** |
|
| 603 | + * Présence d'une négation (truc !op valeur) |
|
| 604 | + * |
|
| 605 | + * @var null|string |
|
| 606 | + */ |
|
| 607 | + public $not; |
|
| 608 | + |
|
| 609 | + /** |
|
| 610 | + * Présence d'une exclusion (!truc op valeur) |
|
| 611 | + * |
|
| 612 | + * @var null|string |
|
| 613 | + */ |
|
| 614 | + public $exclus; |
|
| 615 | + |
|
| 616 | + /** |
|
| 617 | + * Présence d'une condition dans le critère (truc ?) |
|
| 618 | + * |
|
| 619 | + * @var bool |
|
| 620 | + */ |
|
| 621 | + public $cond = false; |
|
| 622 | + |
|
| 623 | + /** |
|
| 624 | + * Paramètres du critère |
|
| 625 | + * - $param[0] : élément avant l'opérateur |
|
| 626 | + * - $param[1..n] : éléments après l'opérateur |
|
| 627 | + * |
|
| 628 | + * @var array |
|
| 629 | + */ |
|
| 630 | + public $param = []; |
|
| 631 | + |
|
| 632 | + /** |
|
| 633 | + * Numéro de ligne dans le code source du squelette |
|
| 634 | + * |
|
| 635 | + * @var int |
|
| 636 | + */ |
|
| 637 | + public $ligne = 0; |
|
| 638 | 638 | } |
| 639 | 639 | |
| 640 | 640 | /** |
@@ -643,139 +643,139 @@ discard block |
||
| 643 | 643 | * @package SPIP\Core\Compilateur\AST |
| 644 | 644 | **/ |
| 645 | 645 | class Champ { |
| 646 | - /** |
|
| 647 | - * Type de noeud |
|
| 648 | - * |
|
| 649 | - * @var string |
|
| 650 | - */ |
|
| 651 | - public $type = 'champ'; |
|
| 652 | - |
|
| 653 | - /** |
|
| 654 | - * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 655 | - * |
|
| 656 | - * @var string|null |
|
| 657 | - */ |
|
| 658 | - public $nom_champ; |
|
| 659 | - |
|
| 660 | - /** |
|
| 661 | - * Identifiant de la boucle parente si explicité |
|
| 662 | - * |
|
| 663 | - * @var string|null |
|
| 664 | - */ |
|
| 665 | - public $nom_boucle = ''; |
|
| 666 | - |
|
| 667 | - /** |
|
| 668 | - * Partie optionnelle avant |
|
| 669 | - * |
|
| 670 | - * @var null|string|array |
|
| 671 | - */ |
|
| 672 | - public $avant; |
|
| 673 | - |
|
| 674 | - /** |
|
| 675 | - * Partie optionnelle après |
|
| 676 | - * |
|
| 677 | - * @var null|string|array |
|
| 678 | - */ |
|
| 679 | - public $apres; |
|
| 680 | - |
|
| 681 | - /** |
|
| 682 | - * Étoiles : annuler des automatismes |
|
| 683 | - * |
|
| 684 | - * - '*' annule les filtres automatiques |
|
| 685 | - * - '**' annule en plus les protections de scripts |
|
| 686 | - * |
|
| 687 | - * @var null|string |
|
| 688 | - */ |
|
| 689 | - public $etoile; |
|
| 690 | - |
|
| 691 | - /** |
|
| 692 | - * Arguments et filtres explicites sur la balise |
|
| 693 | - * |
|
| 694 | - * - $param[0] contient les arguments de la balise |
|
| 695 | - * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 696 | - * |
|
| 697 | - * @var array |
|
| 698 | - */ |
|
| 699 | - public $param = []; |
|
| 700 | - |
|
| 701 | - /** |
|
| 702 | - * Source des filtres (compatibilité) (?) |
|
| 703 | - * |
|
| 704 | - * @var array|null |
|
| 705 | - */ |
|
| 706 | - public $fonctions = []; |
|
| 707 | - |
|
| 708 | - /** |
|
| 709 | - * Identifiant de la boucle |
|
| 710 | - * |
|
| 711 | - * @var string |
|
| 712 | - */ |
|
| 713 | - public $id_boucle = ''; |
|
| 714 | - |
|
| 715 | - /** |
|
| 716 | - * AST du squelette, liste de toutes les boucles |
|
| 717 | - * |
|
| 718 | - * @var Boucles[] |
|
| 719 | - */ |
|
| 720 | - public $boucles; |
|
| 721 | - |
|
| 722 | - /** |
|
| 723 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 724 | - * |
|
| 725 | - * @var string|null |
|
| 726 | - */ |
|
| 727 | - public $type_requete; |
|
| 728 | - |
|
| 729 | - /** |
|
| 730 | - * Résultat de la compilation: toujours une expression PHP |
|
| 731 | - * |
|
| 732 | - * @var string |
|
| 733 | - */ |
|
| 734 | - public $code = ''; |
|
| 735 | - |
|
| 736 | - /** |
|
| 737 | - * Interdire les scripts |
|
| 738 | - * |
|
| 739 | - * false si on est sûr de cette balise |
|
| 740 | - * |
|
| 741 | - * @see interdire_scripts() |
|
| 742 | - * @var bool |
|
| 743 | - */ |
|
| 744 | - public $interdire_scripts = true; |
|
| 745 | - |
|
| 746 | - /** |
|
| 747 | - * Description du squelette |
|
| 748 | - * |
|
| 749 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 750 | - * |
|
| 751 | - * Peut contenir les index : |
|
| 752 | - * |
|
| 753 | - * - nom : Nom du fichier de cache |
|
| 754 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 755 | - * - sourcefile : Chemin du squelette |
|
| 756 | - * - squelette : Code du squelette |
|
| 757 | - * - id_mere : Identifiant de la boucle parente |
|
| 758 | - * - documents : Pour embed et img dans les textes |
|
| 759 | - * - session : Pour un cache sessionné par auteur |
|
| 760 | - * - niv : Niveau de tabulation |
|
| 761 | - * |
|
| 762 | - * @var array |
|
| 763 | - */ |
|
| 764 | - public $descr = []; |
|
| 765 | - |
|
| 766 | - /** |
|
| 767 | - * Numéro de ligne dans le code source du squelette |
|
| 768 | - * |
|
| 769 | - * @var int |
|
| 770 | - */ |
|
| 771 | - public $ligne = 0; |
|
| 772 | - |
|
| 773 | - /** |
|
| 774 | - * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 775 | - * |
|
| 776 | - * @var bool |
|
| 777 | - */ |
|
| 778 | - public $balise_calculee = false; |
|
| 646 | + /** |
|
| 647 | + * Type de noeud |
|
| 648 | + * |
|
| 649 | + * @var string |
|
| 650 | + */ |
|
| 651 | + public $type = 'champ'; |
|
| 652 | + |
|
| 653 | + /** |
|
| 654 | + * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 655 | + * |
|
| 656 | + * @var string|null |
|
| 657 | + */ |
|
| 658 | + public $nom_champ; |
|
| 659 | + |
|
| 660 | + /** |
|
| 661 | + * Identifiant de la boucle parente si explicité |
|
| 662 | + * |
|
| 663 | + * @var string|null |
|
| 664 | + */ |
|
| 665 | + public $nom_boucle = ''; |
|
| 666 | + |
|
| 667 | + /** |
|
| 668 | + * Partie optionnelle avant |
|
| 669 | + * |
|
| 670 | + * @var null|string|array |
|
| 671 | + */ |
|
| 672 | + public $avant; |
|
| 673 | + |
|
| 674 | + /** |
|
| 675 | + * Partie optionnelle après |
|
| 676 | + * |
|
| 677 | + * @var null|string|array |
|
| 678 | + */ |
|
| 679 | + public $apres; |
|
| 680 | + |
|
| 681 | + /** |
|
| 682 | + * Étoiles : annuler des automatismes |
|
| 683 | + * |
|
| 684 | + * - '*' annule les filtres automatiques |
|
| 685 | + * - '**' annule en plus les protections de scripts |
|
| 686 | + * |
|
| 687 | + * @var null|string |
|
| 688 | + */ |
|
| 689 | + public $etoile; |
|
| 690 | + |
|
| 691 | + /** |
|
| 692 | + * Arguments et filtres explicites sur la balise |
|
| 693 | + * |
|
| 694 | + * - $param[0] contient les arguments de la balise |
|
| 695 | + * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 696 | + * |
|
| 697 | + * @var array |
|
| 698 | + */ |
|
| 699 | + public $param = []; |
|
| 700 | + |
|
| 701 | + /** |
|
| 702 | + * Source des filtres (compatibilité) (?) |
|
| 703 | + * |
|
| 704 | + * @var array|null |
|
| 705 | + */ |
|
| 706 | + public $fonctions = []; |
|
| 707 | + |
|
| 708 | + /** |
|
| 709 | + * Identifiant de la boucle |
|
| 710 | + * |
|
| 711 | + * @var string |
|
| 712 | + */ |
|
| 713 | + public $id_boucle = ''; |
|
| 714 | + |
|
| 715 | + /** |
|
| 716 | + * AST du squelette, liste de toutes les boucles |
|
| 717 | + * |
|
| 718 | + * @var Boucles[] |
|
| 719 | + */ |
|
| 720 | + public $boucles; |
|
| 721 | + |
|
| 722 | + /** |
|
| 723 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 724 | + * |
|
| 725 | + * @var string|null |
|
| 726 | + */ |
|
| 727 | + public $type_requete; |
|
| 728 | + |
|
| 729 | + /** |
|
| 730 | + * Résultat de la compilation: toujours une expression PHP |
|
| 731 | + * |
|
| 732 | + * @var string |
|
| 733 | + */ |
|
| 734 | + public $code = ''; |
|
| 735 | + |
|
| 736 | + /** |
|
| 737 | + * Interdire les scripts |
|
| 738 | + * |
|
| 739 | + * false si on est sûr de cette balise |
|
| 740 | + * |
|
| 741 | + * @see interdire_scripts() |
|
| 742 | + * @var bool |
|
| 743 | + */ |
|
| 744 | + public $interdire_scripts = true; |
|
| 745 | + |
|
| 746 | + /** |
|
| 747 | + * Description du squelette |
|
| 748 | + * |
|
| 749 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 750 | + * |
|
| 751 | + * Peut contenir les index : |
|
| 752 | + * |
|
| 753 | + * - nom : Nom du fichier de cache |
|
| 754 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 755 | + * - sourcefile : Chemin du squelette |
|
| 756 | + * - squelette : Code du squelette |
|
| 757 | + * - id_mere : Identifiant de la boucle parente |
|
| 758 | + * - documents : Pour embed et img dans les textes |
|
| 759 | + * - session : Pour un cache sessionné par auteur |
|
| 760 | + * - niv : Niveau de tabulation |
|
| 761 | + * |
|
| 762 | + * @var array |
|
| 763 | + */ |
|
| 764 | + public $descr = []; |
|
| 765 | + |
|
| 766 | + /** |
|
| 767 | + * Numéro de ligne dans le code source du squelette |
|
| 768 | + * |
|
| 769 | + * @var int |
|
| 770 | + */ |
|
| 771 | + public $ligne = 0; |
|
| 772 | + |
|
| 773 | + /** |
|
| 774 | + * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 775 | + * |
|
| 776 | + * @var bool |
|
| 777 | + */ |
|
| 778 | + public $balise_calculee = false; |
|
| 779 | 779 | } |
| 780 | 780 | |
| 781 | 781 | |
@@ -783,123 +783,123 @@ discard block |
||
| 783 | 783 | * Description d'une chaîne de langue |
| 784 | 784 | **/ |
| 785 | 785 | class Idiome { |
| 786 | - /** |
|
| 787 | - * Type de noeud |
|
| 788 | - * |
|
| 789 | - * @var string |
|
| 790 | - */ |
|
| 791 | - public $type = 'idiome'; |
|
| 792 | - |
|
| 793 | - /** |
|
| 794 | - * Clé de traduction demandée. Exemple 'item_oui' |
|
| 795 | - * |
|
| 796 | - * @var string |
|
| 797 | - */ |
|
| 798 | - public $nom_champ = ''; |
|
| 799 | - |
|
| 800 | - /** |
|
| 801 | - * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 802 | - * |
|
| 803 | - * @var string |
|
| 804 | - */ |
|
| 805 | - public $module = ''; |
|
| 806 | - |
|
| 807 | - /** |
|
| 808 | - * Arguments à passer à la chaîne |
|
| 809 | - * |
|
| 810 | - * @var array |
|
| 811 | - */ |
|
| 812 | - public $arg = []; |
|
| 813 | - |
|
| 814 | - /** |
|
| 815 | - * Filtres à appliquer au résultat |
|
| 816 | - * |
|
| 817 | - * @var array |
|
| 818 | - */ |
|
| 819 | - public $param = []; |
|
| 820 | - |
|
| 821 | - /** |
|
| 822 | - * Source des filtres (compatibilité) (?) |
|
| 823 | - * |
|
| 824 | - * @var array|null |
|
| 825 | - */ |
|
| 826 | - public $fonctions = []; |
|
| 827 | - |
|
| 828 | - /** |
|
| 829 | - * Inutilisé, propriété générique de l'AST |
|
| 830 | - * |
|
| 831 | - * @var string|array |
|
| 832 | - */ |
|
| 833 | - public $avant = ''; |
|
| 834 | - |
|
| 835 | - /** |
|
| 836 | - * Inutilisé, propriété générique de l'AST |
|
| 837 | - * |
|
| 838 | - * @var string|array |
|
| 839 | - */ |
|
| 840 | - public $apres = ''; |
|
| 841 | - |
|
| 842 | - /** |
|
| 843 | - * Identifiant de la boucle |
|
| 844 | - * |
|
| 845 | - * @var string |
|
| 846 | - */ |
|
| 847 | - public $id_boucle = ''; |
|
| 848 | - |
|
| 849 | - /** |
|
| 850 | - * AST du squelette, liste de toutes les boucles |
|
| 851 | - * |
|
| 852 | - * @var Boucles[] |
|
| 853 | - */ |
|
| 854 | - public $boucles; |
|
| 855 | - |
|
| 856 | - /** |
|
| 857 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 858 | - * |
|
| 859 | - * @var string|null |
|
| 860 | - */ |
|
| 861 | - public $type_requete; |
|
| 862 | - |
|
| 863 | - /** |
|
| 864 | - * Résultat de la compilation: toujours une expression PHP |
|
| 865 | - * |
|
| 866 | - * @var string |
|
| 867 | - */ |
|
| 868 | - public $code = ''; |
|
| 869 | - |
|
| 870 | - /** |
|
| 871 | - * Interdire les scripts |
|
| 872 | - * |
|
| 873 | - * @see interdire_scripts() |
|
| 874 | - * @var bool |
|
| 875 | - */ |
|
| 876 | - public $interdire_scripts = false; |
|
| 877 | - |
|
| 878 | - /** |
|
| 879 | - * Description du squelette |
|
| 880 | - * |
|
| 881 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 882 | - * |
|
| 883 | - * Peut contenir les index : |
|
| 884 | - * - nom : Nom du fichier de cache |
|
| 885 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 886 | - * - sourcefile : Chemin du squelette |
|
| 887 | - * - squelette : Code du squelette |
|
| 888 | - * - id_mere : Identifiant de la boucle parente |
|
| 889 | - * - documents : Pour embed et img dans les textes |
|
| 890 | - * - session : Pour un cache sessionné par auteur |
|
| 891 | - * - niv : Niveau de tabulation |
|
| 892 | - * |
|
| 893 | - * @var array |
|
| 894 | - */ |
|
| 895 | - public $descr = []; |
|
| 896 | - |
|
| 897 | - /** |
|
| 898 | - * Numéro de ligne dans le code source du squelette |
|
| 899 | - * |
|
| 900 | - * @var int |
|
| 901 | - */ |
|
| 902 | - public $ligne = 0; |
|
| 786 | + /** |
|
| 787 | + * Type de noeud |
|
| 788 | + * |
|
| 789 | + * @var string |
|
| 790 | + */ |
|
| 791 | + public $type = 'idiome'; |
|
| 792 | + |
|
| 793 | + /** |
|
| 794 | + * Clé de traduction demandée. Exemple 'item_oui' |
|
| 795 | + * |
|
| 796 | + * @var string |
|
| 797 | + */ |
|
| 798 | + public $nom_champ = ''; |
|
| 799 | + |
|
| 800 | + /** |
|
| 801 | + * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 802 | + * |
|
| 803 | + * @var string |
|
| 804 | + */ |
|
| 805 | + public $module = ''; |
|
| 806 | + |
|
| 807 | + /** |
|
| 808 | + * Arguments à passer à la chaîne |
|
| 809 | + * |
|
| 810 | + * @var array |
|
| 811 | + */ |
|
| 812 | + public $arg = []; |
|
| 813 | + |
|
| 814 | + /** |
|
| 815 | + * Filtres à appliquer au résultat |
|
| 816 | + * |
|
| 817 | + * @var array |
|
| 818 | + */ |
|
| 819 | + public $param = []; |
|
| 820 | + |
|
| 821 | + /** |
|
| 822 | + * Source des filtres (compatibilité) (?) |
|
| 823 | + * |
|
| 824 | + * @var array|null |
|
| 825 | + */ |
|
| 826 | + public $fonctions = []; |
|
| 827 | + |
|
| 828 | + /** |
|
| 829 | + * Inutilisé, propriété générique de l'AST |
|
| 830 | + * |
|
| 831 | + * @var string|array |
|
| 832 | + */ |
|
| 833 | + public $avant = ''; |
|
| 834 | + |
|
| 835 | + /** |
|
| 836 | + * Inutilisé, propriété générique de l'AST |
|
| 837 | + * |
|
| 838 | + * @var string|array |
|
| 839 | + */ |
|
| 840 | + public $apres = ''; |
|
| 841 | + |
|
| 842 | + /** |
|
| 843 | + * Identifiant de la boucle |
|
| 844 | + * |
|
| 845 | + * @var string |
|
| 846 | + */ |
|
| 847 | + public $id_boucle = ''; |
|
| 848 | + |
|
| 849 | + /** |
|
| 850 | + * AST du squelette, liste de toutes les boucles |
|
| 851 | + * |
|
| 852 | + * @var Boucles[] |
|
| 853 | + */ |
|
| 854 | + public $boucles; |
|
| 855 | + |
|
| 856 | + /** |
|
| 857 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 858 | + * |
|
| 859 | + * @var string|null |
|
| 860 | + */ |
|
| 861 | + public $type_requete; |
|
| 862 | + |
|
| 863 | + /** |
|
| 864 | + * Résultat de la compilation: toujours une expression PHP |
|
| 865 | + * |
|
| 866 | + * @var string |
|
| 867 | + */ |
|
| 868 | + public $code = ''; |
|
| 869 | + |
|
| 870 | + /** |
|
| 871 | + * Interdire les scripts |
|
| 872 | + * |
|
| 873 | + * @see interdire_scripts() |
|
| 874 | + * @var bool |
|
| 875 | + */ |
|
| 876 | + public $interdire_scripts = false; |
|
| 877 | + |
|
| 878 | + /** |
|
| 879 | + * Description du squelette |
|
| 880 | + * |
|
| 881 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 882 | + * |
|
| 883 | + * Peut contenir les index : |
|
| 884 | + * - nom : Nom du fichier de cache |
|
| 885 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 886 | + * - sourcefile : Chemin du squelette |
|
| 887 | + * - squelette : Code du squelette |
|
| 888 | + * - id_mere : Identifiant de la boucle parente |
|
| 889 | + * - documents : Pour embed et img dans les textes |
|
| 890 | + * - session : Pour un cache sessionné par auteur |
|
| 891 | + * - niv : Niveau de tabulation |
|
| 892 | + * |
|
| 893 | + * @var array |
|
| 894 | + */ |
|
| 895 | + public $descr = []; |
|
| 896 | + |
|
| 897 | + /** |
|
| 898 | + * Numéro de ligne dans le code source du squelette |
|
| 899 | + * |
|
| 900 | + * @var int |
|
| 901 | + */ |
|
| 902 | + public $ligne = 0; |
|
| 903 | 903 | } |
| 904 | 904 | |
| 905 | 905 | /** |
@@ -908,28 +908,28 @@ discard block |
||
| 908 | 908 | * @package SPIP\Core\Compilateur\AST |
| 909 | 909 | **/ |
| 910 | 910 | class Polyglotte { |
| 911 | - /** |
|
| 912 | - * Type de noeud |
|
| 913 | - * |
|
| 914 | - * @var string |
|
| 915 | - */ |
|
| 916 | - public $type = 'polyglotte'; |
|
| 917 | - |
|
| 918 | - /** |
|
| 919 | - * Tableau des traductions possibles classées par langue |
|
| 920 | - * |
|
| 921 | - * Tableau code de langue => texte |
|
| 922 | - * |
|
| 923 | - * @var array |
|
| 924 | - */ |
|
| 925 | - public $traductions = []; |
|
| 926 | - |
|
| 927 | - /** |
|
| 928 | - * Numéro de ligne dans le code source du squelette |
|
| 929 | - * |
|
| 930 | - * @var int |
|
| 931 | - */ |
|
| 932 | - public $ligne = 0; |
|
| 911 | + /** |
|
| 912 | + * Type de noeud |
|
| 913 | + * |
|
| 914 | + * @var string |
|
| 915 | + */ |
|
| 916 | + public $type = 'polyglotte'; |
|
| 917 | + |
|
| 918 | + /** |
|
| 919 | + * Tableau des traductions possibles classées par langue |
|
| 920 | + * |
|
| 921 | + * Tableau code de langue => texte |
|
| 922 | + * |
|
| 923 | + * @var array |
|
| 924 | + */ |
|
| 925 | + public $traductions = []; |
|
| 926 | + |
|
| 927 | + /** |
|
| 928 | + * Numéro de ligne dans le code source du squelette |
|
| 929 | + * |
|
| 930 | + * @var int |
|
| 931 | + */ |
|
| 932 | + public $ligne = 0; |
|
| 933 | 933 | } |
| 934 | 934 | |
| 935 | 935 | |
@@ -952,90 +952,90 @@ discard block |
||
| 952 | 952 | */ |
| 953 | 953 | function declarer_interfaces() { |
| 954 | 954 | |
| 955 | - $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 956 | - $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 957 | - $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 958 | - $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 959 | - |
|
| 960 | - // definition des statuts de publication |
|
| 961 | - $GLOBALS['table_statut'] = []; |
|
| 962 | - |
|
| 963 | - // |
|
| 964 | - // tableau des tables de jointures |
|
| 965 | - // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 966 | - $GLOBALS['tables_jointures'] = []; |
|
| 967 | - $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 968 | - |
|
| 969 | - // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 970 | - $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 971 | - |
|
| 972 | - |
|
| 973 | - if (!defined('_TRAITEMENT_TYPO')) { |
|
| 974 | - define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 975 | - } |
|
| 976 | - if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 977 | - define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 978 | - } |
|
| 979 | - if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 980 | - define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 981 | - } |
|
| 982 | - $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; |
|
| 983 | - $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; |
|
| 984 | - $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; |
|
| 985 | - $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 986 | - $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 987 | - $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 988 | - $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 989 | - $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 990 | - $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 991 | - $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 992 | - $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 993 | - $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 994 | - $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 995 | - $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 996 | - $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 997 | - $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 998 | - $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 999 | - $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 1000 | - $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1001 | - $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 1002 | - $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 1003 | - $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1004 | - $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 1005 | - $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1006 | - |
|
| 1007 | - // valeur par defaut pour les balises non listees ci-dessus |
|
| 1008 | - $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1009 | - // toujours securiser les DATA |
|
| 1010 | - $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1011 | - // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1012 | - $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1013 | - |
|
| 1014 | - |
|
| 1015 | - // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1016 | - $interfaces = pipeline( |
|
| 1017 | - 'declarer_tables_interfaces', |
|
| 1018 | - [ |
|
| 1019 | - 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1020 | - 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1021 | - 'table_date' => $GLOBALS['table_date'], |
|
| 1022 | - 'table_titre' => $GLOBALS['table_titre'], |
|
| 1023 | - 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1024 | - 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1025 | - 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1026 | - 'table_statut' => $GLOBALS['table_statut'], |
|
| 1027 | - ] |
|
| 1028 | - ); |
|
| 1029 | - if ($interfaces) { |
|
| 1030 | - $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1031 | - $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1032 | - $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1033 | - $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1034 | - $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1035 | - $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1036 | - $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1037 | - $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1038 | - } |
|
| 955 | + $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 956 | + $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 957 | + $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 958 | + $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 959 | + |
|
| 960 | + // definition des statuts de publication |
|
| 961 | + $GLOBALS['table_statut'] = []; |
|
| 962 | + |
|
| 963 | + // |
|
| 964 | + // tableau des tables de jointures |
|
| 965 | + // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 966 | + $GLOBALS['tables_jointures'] = []; |
|
| 967 | + $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 968 | + |
|
| 969 | + // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 970 | + $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 971 | + |
|
| 972 | + |
|
| 973 | + if (!defined('_TRAITEMENT_TYPO')) { |
|
| 974 | + define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 975 | + } |
|
| 976 | + if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 977 | + define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 978 | + } |
|
| 979 | + if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 980 | + define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 981 | + } |
|
| 982 | + $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')'; |
|
| 983 | + $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)'; |
|
| 984 | + $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')'; |
|
| 985 | + $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 986 | + $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 987 | + $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 988 | + $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 989 | + $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 990 | + $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 991 | + $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 992 | + $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 993 | + $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 994 | + $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 995 | + $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 996 | + $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 997 | + $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 998 | + $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 999 | + $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 1000 | + $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1001 | + $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 1002 | + $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 1003 | + $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 1004 | + $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 1005 | + $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1006 | + |
|
| 1007 | + // valeur par defaut pour les balises non listees ci-dessus |
|
| 1008 | + $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1009 | + // toujours securiser les DATA |
|
| 1010 | + $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1011 | + // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1012 | + $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1013 | + |
|
| 1014 | + |
|
| 1015 | + // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1016 | + $interfaces = pipeline( |
|
| 1017 | + 'declarer_tables_interfaces', |
|
| 1018 | + [ |
|
| 1019 | + 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1020 | + 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1021 | + 'table_date' => $GLOBALS['table_date'], |
|
| 1022 | + 'table_titre' => $GLOBALS['table_titre'], |
|
| 1023 | + 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1024 | + 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1025 | + 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1026 | + 'table_statut' => $GLOBALS['table_statut'], |
|
| 1027 | + ] |
|
| 1028 | + ); |
|
| 1029 | + if ($interfaces) { |
|
| 1030 | + $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1031 | + $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1032 | + $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1033 | + $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1034 | + $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1035 | + $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1036 | + $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1037 | + $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1038 | + } |
|
| 1039 | 1039 | } |
| 1040 | 1040 | |
| 1041 | 1041 | declarer_interfaces(); |
@@ -16,10 +16,10 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Actions |
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | - use Spip\Chiffrer\SpipCles; |
|
| 19 | + use Spip\Chiffrer\SpipCles; |
|
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | /** |
@@ -52,19 +52,19 @@ discard block |
||
| 52 | 52 | * @return array|string |
| 53 | 53 | */ |
| 54 | 54 | function inc_securiser_action_dist($action = '', $arg = '', $redirect = '', $mode = false, $att = '', $public = false) { |
| 55 | - if ($action) { |
|
| 56 | - return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public); |
|
| 57 | - } else { |
|
| 58 | - $arg = _request('arg'); |
|
| 59 | - $hash = _request('hash'); |
|
| 60 | - $action = _request('action') ?: _request('formulaire_action'); |
|
| 61 | - if ($a = verifier_action_auteur("$action-$arg", $hash)) { |
|
| 62 | - return $arg; |
|
| 63 | - } |
|
| 64 | - include_spip('inc/minipres'); |
|
| 65 | - echo minipres(); |
|
| 66 | - exit; |
|
| 67 | - } |
|
| 55 | + if ($action) { |
|
| 56 | + return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public); |
|
| 57 | + } else { |
|
| 58 | + $arg = _request('arg'); |
|
| 59 | + $hash = _request('hash'); |
|
| 60 | + $action = _request('action') ?: _request('formulaire_action'); |
|
| 61 | + if ($a = verifier_action_auteur("$action-$arg", $hash)) { |
|
| 62 | + return $arg; |
|
| 63 | + } |
|
| 64 | + include_spip('inc/minipres'); |
|
| 65 | + echo minipres(); |
|
| 66 | + exit; |
|
| 67 | + } |
|
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | /** |
@@ -83,29 +83,29 @@ discard block |
||
| 83 | 83 | */ |
| 84 | 84 | function demander_confirmation_avant_action($titre, $titre_bouton, $url_action = null) { |
| 85 | 85 | |
| 86 | - if (!$url_action) { |
|
| 87 | - $url_action = self(); |
|
| 88 | - $action = _request('action'); |
|
| 89 | - $url_action = parametre_url($url_action, 'action', $action, '&'); |
|
| 90 | - } |
|
| 91 | - else { |
|
| 92 | - $action = parametre_url($url_action, 'action'); |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - $arg = parametre_url($url_action, 'arg'); |
|
| 96 | - $confirm = md5("$action:$arg:" . realpath(__FILE__)); |
|
| 97 | - if (_request('confirm_action') === $confirm) { |
|
| 98 | - return true; |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - $url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&'); |
|
| 102 | - include_spip('inc/filtres'); |
|
| 103 | - $bouton_action = bouton_action($titre_bouton, $url_confirm); |
|
| 104 | - $corps = "<div style='text-align:center;'>$bouton_action</div>"; |
|
| 105 | - |
|
| 106 | - include_spip('inc/minipres'); |
|
| 107 | - echo minipres($titre, $corps); |
|
| 108 | - exit; |
|
| 86 | + if (!$url_action) { |
|
| 87 | + $url_action = self(); |
|
| 88 | + $action = _request('action'); |
|
| 89 | + $url_action = parametre_url($url_action, 'action', $action, '&'); |
|
| 90 | + } |
|
| 91 | + else { |
|
| 92 | + $action = parametre_url($url_action, 'action'); |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + $arg = parametre_url($url_action, 'arg'); |
|
| 96 | + $confirm = md5("$action:$arg:" . realpath(__FILE__)); |
|
| 97 | + if (_request('confirm_action') === $confirm) { |
|
| 98 | + return true; |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + $url_confirm = parametre_url($url_action, 'confirm_action', $confirm, '&'); |
|
| 102 | + include_spip('inc/filtres'); |
|
| 103 | + $bouton_action = bouton_action($titre_bouton, $url_confirm); |
|
| 104 | + $corps = "<div style='text-align:center;'>$bouton_action</div>"; |
|
| 105 | + |
|
| 106 | + include_spip('inc/minipres'); |
|
| 107 | + echo minipres($titre, $corps); |
|
| 108 | + exit; |
|
| 109 | 109 | } |
| 110 | 110 | |
| 111 | 111 | /** |
@@ -136,34 +136,34 @@ discard block |
||
| 136 | 136 | */ |
| 137 | 137 | function securiser_action_auteur($action, $arg, $redirect = '', $mode = false, $att = '', $public = false) { |
| 138 | 138 | |
| 139 | - // mode URL ou array |
|
| 140 | - if (!is_string($mode)) { |
|
| 141 | - $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null); |
|
| 142 | - |
|
| 143 | - $r = rawurlencode($redirect); |
|
| 144 | - if ($mode === -1) { |
|
| 145 | - return ['action' => $action, 'arg' => $arg, 'hash' => $hash]; |
|
| 146 | - } else { |
|
| 147 | - return generer_url_action( |
|
| 148 | - $action, |
|
| 149 | - 'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"), |
|
| 150 | - $mode, |
|
| 151 | - $public |
|
| 152 | - ); |
|
| 153 | - } |
|
| 154 | - } |
|
| 155 | - |
|
| 156 | - // mode formulaire |
|
| 157 | - $hash = calculer_action_auteur("$action-$arg"); |
|
| 158 | - $att .= " style='margin: 0px; border: 0px'"; |
|
| 159 | - if ($redirect) { |
|
| 160 | - $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", ''', $redirect) . "' />"; |
|
| 161 | - } |
|
| 162 | - $mode .= $redirect . " |
|
| 139 | + // mode URL ou array |
|
| 140 | + if (!is_string($mode)) { |
|
| 141 | + $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null); |
|
| 142 | + |
|
| 143 | + $r = rawurlencode($redirect); |
|
| 144 | + if ($mode === -1) { |
|
| 145 | + return ['action' => $action, 'arg' => $arg, 'hash' => $hash]; |
|
| 146 | + } else { |
|
| 147 | + return generer_url_action( |
|
| 148 | + $action, |
|
| 149 | + 'arg=' . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"), |
|
| 150 | + $mode, |
|
| 151 | + $public |
|
| 152 | + ); |
|
| 153 | + } |
|
| 154 | + } |
|
| 155 | + |
|
| 156 | + // mode formulaire |
|
| 157 | + $hash = calculer_action_auteur("$action-$arg"); |
|
| 158 | + $att .= " style='margin: 0px; border: 0px'"; |
|
| 159 | + if ($redirect) { |
|
| 160 | + $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", ''', $redirect) . "' />"; |
|
| 161 | + } |
|
| 162 | + $mode .= $redirect . " |
|
| 163 | 163 | <input name='hash' type='hidden' value='$hash' /> |
| 164 | 164 | <input name='arg' type='hidden' value='$arg' />"; |
| 165 | 165 | |
| 166 | - return generer_form_action($action, $mode, $att, $public); |
|
| 166 | + return generer_form_action($action, $mode, $att, $public); |
|
| 167 | 167 | } |
| 168 | 168 | |
| 169 | 169 | /** |
@@ -173,48 +173,48 @@ discard block |
||
| 173 | 173 | * @return array |
| 174 | 174 | */ |
| 175 | 175 | function caracteriser_auteur($id_auteur = null) { |
| 176 | - static $caracterisation = []; |
|
| 177 | - |
|
| 178 | - if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 179 | - // si l'auteur courant n'est pas connu alors qu'il peut demander une action |
|
| 180 | - // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. |
|
| 181 | - // S'il n'avait pas le droit de realiser cette action, le hash sera faux. |
|
| 182 | - if ( |
|
| 183 | - isset($_COOKIE['spip_session']) |
|
| 184 | - and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)) |
|
| 185 | - ) { |
|
| 186 | - return [$r[1], '']; |
|
| 187 | - // Necessaire aux forums anonymes. |
|
| 188 | - // Pour le reste, ca echouera. |
|
| 189 | - } else { |
|
| 190 | - return ['0', '']; |
|
| 191 | - } |
|
| 192 | - } |
|
| 193 | - // Eviter l'acces SQL si le pass est connu de PHP |
|
| 194 | - if (is_null($id_auteur)) { |
|
| 195 | - $id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0; |
|
| 196 | - if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) { |
|
| 197 | - return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']]; |
|
| 198 | - } |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - if (isset($caracterisation[$id_auteur])) { |
|
| 202 | - return $caracterisation[$id_auteur]; |
|
| 203 | - } |
|
| 204 | - |
|
| 205 | - if ($id_auteur) { |
|
| 206 | - include_spip('base/abstract_sql'); |
|
| 207 | - $t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur"); |
|
| 208 | - if ($t) { |
|
| 209 | - return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']]; |
|
| 210 | - } |
|
| 211 | - include_spip('inc/minipres'); |
|
| 212 | - echo minipres(); |
|
| 213 | - exit; |
|
| 214 | - } // Visiteur anonyme, pour ls forums par exemple |
|
| 215 | - else { |
|
| 216 | - return ['0', '']; |
|
| 217 | - } |
|
| 176 | + static $caracterisation = []; |
|
| 177 | + |
|
| 178 | + if (is_null($id_auteur) and !isset($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 179 | + // si l'auteur courant n'est pas connu alors qu'il peut demander une action |
|
| 180 | + // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. |
|
| 181 | + // S'il n'avait pas le droit de realiser cette action, le hash sera faux. |
|
| 182 | + if ( |
|
| 183 | + isset($_COOKIE['spip_session']) |
|
| 184 | + and (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)) |
|
| 185 | + ) { |
|
| 186 | + return [$r[1], '']; |
|
| 187 | + // Necessaire aux forums anonymes. |
|
| 188 | + // Pour le reste, ca echouera. |
|
| 189 | + } else { |
|
| 190 | + return ['0', '']; |
|
| 191 | + } |
|
| 192 | + } |
|
| 193 | + // Eviter l'acces SQL si le pass est connu de PHP |
|
| 194 | + if (is_null($id_auteur)) { |
|
| 195 | + $id_auteur = $GLOBALS['visiteur_session']['id_auteur'] ?? 0; |
|
| 196 | + if (isset($GLOBALS['visiteur_session']['pass']) and $GLOBALS['visiteur_session']['pass']) { |
|
| 197 | + return $caracterisation[$id_auteur] = [$id_auteur, $GLOBALS['visiteur_session']['pass']]; |
|
| 198 | + } |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + if (isset($caracterisation[$id_auteur])) { |
|
| 202 | + return $caracterisation[$id_auteur]; |
|
| 203 | + } |
|
| 204 | + |
|
| 205 | + if ($id_auteur) { |
|
| 206 | + include_spip('base/abstract_sql'); |
|
| 207 | + $t = sql_fetsel('id_auteur, pass', 'spip_auteurs', "id_auteur=$id_auteur"); |
|
| 208 | + if ($t) { |
|
| 209 | + return $caracterisation[$id_auteur] = [$t['id_auteur'], $t['pass']]; |
|
| 210 | + } |
|
| 211 | + include_spip('inc/minipres'); |
|
| 212 | + echo minipres(); |
|
| 213 | + exit; |
|
| 214 | + } // Visiteur anonyme, pour ls forums par exemple |
|
| 215 | + else { |
|
| 216 | + return ['0', '']; |
|
| 217 | + } |
|
| 218 | 218 | } |
| 219 | 219 | |
| 220 | 220 | /** |
@@ -229,30 +229,30 @@ discard block |
||
| 229 | 229 | * @return string |
| 230 | 230 | */ |
| 231 | 231 | function _action_auteur(string $action, int $id_auteur, ?string $pass, string $alea): string { |
| 232 | - static $sha = []; |
|
| 233 | - $pass = $pass ?? ''; |
|
| 234 | - $entry = "$action:$id_auteur:$pass:$alea"; |
|
| 235 | - if (!isset($sha[$entry])) { |
|
| 236 | - $sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea)); |
|
| 237 | - } |
|
| 238 | - |
|
| 239 | - return $sha[$entry]; |
|
| 232 | + static $sha = []; |
|
| 233 | + $pass = $pass ?? ''; |
|
| 234 | + $entry = "$action:$id_auteur:$pass:$alea"; |
|
| 235 | + if (!isset($sha[$entry])) { |
|
| 236 | + $sha[$entry] = hash_hmac('sha256', "$action::$id_auteur", "$pass::" . _action_get_alea($alea)); |
|
| 237 | + } |
|
| 238 | + |
|
| 239 | + return $sha[$entry]; |
|
| 240 | 240 | } |
| 241 | 241 | |
| 242 | 242 | function _action_get_alea(string $alea): string { |
| 243 | - if (!isset($GLOBALS['meta'][$alea])) { |
|
| 244 | - if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) { |
|
| 245 | - include_spip('inc/acces'); |
|
| 246 | - charger_aleas(); |
|
| 247 | - if (empty($GLOBALS['meta'][$alea])) { |
|
| 248 | - include_spip('inc/minipres'); |
|
| 249 | - echo minipres(); |
|
| 250 | - spip_log("$alea indisponible"); |
|
| 251 | - exit; |
|
| 252 | - } |
|
| 253 | - } |
|
| 254 | - } |
|
| 255 | - return $GLOBALS['meta'][$alea] ?? ''; |
|
| 243 | + if (!isset($GLOBALS['meta'][$alea])) { |
|
| 244 | + if (!$exec = _request('exec') or !autoriser_sans_cookie($exec)) { |
|
| 245 | + include_spip('inc/acces'); |
|
| 246 | + charger_aleas(); |
|
| 247 | + if (empty($GLOBALS['meta'][$alea])) { |
|
| 248 | + include_spip('inc/minipres'); |
|
| 249 | + echo minipres(); |
|
| 250 | + spip_log("$alea indisponible"); |
|
| 251 | + exit; |
|
| 252 | + } |
|
| 253 | + } |
|
| 254 | + } |
|
| 255 | + return $GLOBALS['meta'][$alea] ?? ''; |
|
| 256 | 256 | } |
| 257 | 257 | |
| 258 | 258 | /** |
@@ -263,9 +263,9 @@ discard block |
||
| 263 | 263 | * @return string |
| 264 | 264 | */ |
| 265 | 265 | function calculer_action_auteur($action, $id_auteur = null) { |
| 266 | - [$id_auteur, $pass] = caracteriser_auteur($id_auteur); |
|
| 266 | + [$id_auteur, $pass] = caracteriser_auteur($id_auteur); |
|
| 267 | 267 | |
| 268 | - return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); |
|
| 268 | + return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); |
|
| 269 | 269 | } |
| 270 | 270 | |
| 271 | 271 | |
@@ -278,15 +278,15 @@ discard block |
||
| 278 | 278 | * @return bool |
| 279 | 279 | */ |
| 280 | 280 | function verifier_action_auteur($action, $hash) { |
| 281 | - [$id_auteur, $pass] = caracteriser_auteur(); |
|
| 282 | - if ( |
|
| 283 | - hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) |
|
| 284 | - or hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) |
|
| 285 | - ) { |
|
| 286 | - return true; |
|
| 287 | - } |
|
| 288 | - |
|
| 289 | - return false; |
|
| 281 | + [$id_auteur, $pass] = caracteriser_auteur(); |
|
| 282 | + if ( |
|
| 283 | + hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) |
|
| 284 | + or hash_equals($hash, _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) |
|
| 285 | + ) { |
|
| 286 | + return true; |
|
| 287 | + } |
|
| 288 | + |
|
| 289 | + return false; |
|
| 290 | 290 | } |
| 291 | 291 | |
| 292 | 292 | // |
@@ -301,8 +301,8 @@ discard block |
||
| 301 | 301 | * @return string |
| 302 | 302 | */ |
| 303 | 303 | function secret_du_site() { |
| 304 | - include_spip('inc/chiffrer'); |
|
| 305 | - return SpipCles::secret_du_site(); |
|
| 304 | + include_spip('inc/chiffrer'); |
|
| 305 | + return SpipCles::secret_du_site(); |
|
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | /** |
@@ -312,7 +312,7 @@ discard block |
||
| 312 | 312 | * @return string |
| 313 | 313 | */ |
| 314 | 314 | function calculer_cle_action($action) { |
| 315 | - return hash_hmac('sha256', $action, secret_du_site()); |
|
| 315 | + return hash_hmac('sha256', $action, secret_du_site()); |
|
| 316 | 316 | } |
| 317 | 317 | |
| 318 | 318 | /** |
@@ -323,7 +323,7 @@ discard block |
||
| 323 | 323 | * @return bool |
| 324 | 324 | */ |
| 325 | 325 | function verifier_cle_action($action, $cle) { |
| 326 | - return hash_equals($cle, calculer_cle_action($action)); |
|
| 326 | + return hash_equals($cle, calculer_cle_action($action)); |
|
| 327 | 327 | } |
| 328 | 328 | |
| 329 | 329 | |
@@ -340,19 +340,19 @@ discard block |
||
| 340 | 340 | * @return string Token, de la forme "{id}*{hash}" |
| 341 | 341 | */ |
| 342 | 342 | function calculer_token_previsu($url, $id_auteur = null, $alea = 'alea_ephemere') { |
| 343 | - if (is_null($id_auteur)) { |
|
| 344 | - if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 345 | - $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; |
|
| 346 | - } |
|
| 347 | - } |
|
| 348 | - if (!$id_auteur = intval($id_auteur)) { |
|
| 349 | - return ''; |
|
| 350 | - } |
|
| 351 | - // On nettoie l’URL de tous les var_. |
|
| 352 | - $url = nettoyer_uri_var($url); |
|
| 353 | - |
|
| 354 | - $token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea); |
|
| 355 | - return "$id_auteur-$token"; |
|
| 343 | + if (is_null($id_auteur)) { |
|
| 344 | + if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { |
|
| 345 | + $id_auteur = $GLOBALS['visiteur_session']['id_auteur']; |
|
| 346 | + } |
|
| 347 | + } |
|
| 348 | + if (!$id_auteur = intval($id_auteur)) { |
|
| 349 | + return ''; |
|
| 350 | + } |
|
| 351 | + // On nettoie l’URL de tous les var_. |
|
| 352 | + $url = nettoyer_uri_var($url); |
|
| 353 | + |
|
| 354 | + $token = _action_auteur('previsualiser-' . $url, $id_auteur, secret_du_site(), $alea); |
|
| 355 | + return "$id_auteur-$token"; |
|
| 356 | 356 | } |
| 357 | 357 | |
| 358 | 358 | |
@@ -370,31 +370,31 @@ discard block |
||
| 370 | 370 | * + Tableau (id auteur, type d’objet, id_objet) sinon. |
| 371 | 371 | */ |
| 372 | 372 | function verifier_token_previsu($token) { |
| 373 | - // retrouver auteur / hash |
|
| 374 | - $e = explode('-', $token, 2); |
|
| 375 | - if (count($e) == 2 and is_numeric(reset($e))) { |
|
| 376 | - $id_auteur = intval(reset($e)); |
|
| 377 | - } else { |
|
| 378 | - return false; |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - // calculer le type et id de l’url actuelle |
|
| 382 | - include_spip('inc/urls'); |
|
| 383 | - include_spip('inc/filtres_mini'); |
|
| 384 | - $url = url_absolue(self()); |
|
| 385 | - |
|
| 386 | - // verifier le token |
|
| 387 | - $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere'); |
|
| 388 | - if (!$_token or !hash_equals($token, $_token)) { |
|
| 389 | - $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien'); |
|
| 390 | - if (!$_token or !hash_equals($token, $_token)) { |
|
| 391 | - return false; |
|
| 392 | - } |
|
| 393 | - } |
|
| 394 | - |
|
| 395 | - return [ |
|
| 396 | - 'id_auteur' => $id_auteur, |
|
| 397 | - ]; |
|
| 373 | + // retrouver auteur / hash |
|
| 374 | + $e = explode('-', $token, 2); |
|
| 375 | + if (count($e) == 2 and is_numeric(reset($e))) { |
|
| 376 | + $id_auteur = intval(reset($e)); |
|
| 377 | + } else { |
|
| 378 | + return false; |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + // calculer le type et id de l’url actuelle |
|
| 382 | + include_spip('inc/urls'); |
|
| 383 | + include_spip('inc/filtres_mini'); |
|
| 384 | + $url = url_absolue(self()); |
|
| 385 | + |
|
| 386 | + // verifier le token |
|
| 387 | + $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere'); |
|
| 388 | + if (!$_token or !hash_equals($token, $_token)) { |
|
| 389 | + $_token = calculer_token_previsu($url, $id_auteur, 'alea_ephemere_ancien'); |
|
| 390 | + if (!$_token or !hash_equals($token, $_token)) { |
|
| 391 | + return false; |
|
| 392 | + } |
|
| 393 | + } |
|
| 394 | + |
|
| 395 | + return [ |
|
| 396 | + 'id_auteur' => $id_auteur, |
|
| 397 | + ]; |
|
| 398 | 398 | } |
| 399 | 399 | |
| 400 | 400 | /** |
@@ -403,13 +403,13 @@ discard block |
||
| 403 | 403 | * @return bool|array |
| 404 | 404 | */ |
| 405 | 405 | function decrire_token_previsu() { |
| 406 | - static $desc = null; |
|
| 407 | - if (is_null($desc)) { |
|
| 408 | - if ($token = _request('var_previewtoken')) { |
|
| 409 | - $desc = verifier_token_previsu($token); |
|
| 410 | - } else { |
|
| 411 | - $desc = false; |
|
| 412 | - } |
|
| 413 | - } |
|
| 414 | - return $desc; |
|
| 406 | + static $desc = null; |
|
| 407 | + if (is_null($desc)) { |
|
| 408 | + if ($token = _request('var_previewtoken')) { |
|
| 409 | + $desc = verifier_token_previsu($token); |
|
| 410 | + } else { |
|
| 411 | + $desc = false; |
|
| 412 | + } |
|
| 413 | + } |
|
| 414 | + return $desc; |
|
| 415 | 415 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | include_spip('inc/autoriser'); |
@@ -30,80 +30,80 @@ discard block |
||
| 30 | 30 | * Un tableau des sous rubriques |
| 31 | 31 | */ |
| 32 | 32 | function enfant_rub($collection, $debut = 0, $limite = 500) { |
| 33 | - $voir_logo = (isset($GLOBALS['meta']['image_process']) and $GLOBALS['meta']['image_process'] != 'non'); |
|
| 34 | - $logo = ''; |
|
| 35 | - |
|
| 36 | - if ($voir_logo) { |
|
| 37 | - $chercher_logo = charger_fonction('chercher_logo', 'inc'); |
|
| 38 | - include_spip('inc/filtres_images_mini'); |
|
| 39 | - } |
|
| 40 | - |
|
| 41 | - $res = []; |
|
| 42 | - |
|
| 43 | - $result = sql_select( |
|
| 44 | - 'id_rubrique, id_parent, titre, descriptif, lang', |
|
| 45 | - 'spip_rubriques', |
|
| 46 | - 'id_parent=' . intval($collection), |
|
| 47 | - '', |
|
| 48 | - '0+titre,titre', |
|
| 49 | - $debut == -1 ? '' : "$debut,$limite" |
|
| 50 | - ); |
|
| 51 | - while ($row = sql_fetch($result)) { |
|
| 52 | - $id_rubrique = $row['id_rubrique']; |
|
| 53 | - $id_parent = $row['id_parent']; |
|
| 54 | - // pour etre sur de passer par tous les traitements |
|
| 55 | - $titre = generer_objet_info($id_rubrique, 'rubrique', 'titre'); |
|
| 56 | - if ('' !== ($rang = recuperer_numero($row['titre']))) { |
|
| 57 | - $rang = "<span class='rang'>$rang.</span> "; |
|
| 58 | - } |
|
| 59 | - |
|
| 60 | - if (autoriser('voir', 'rubrique', $id_rubrique)) { |
|
| 61 | - $les_sous_enfants = sous_enfant_rub($id_rubrique); |
|
| 62 | - |
|
| 63 | - changer_typo($row['lang']); |
|
| 64 | - $lang_dir = lang_dir($row['lang']); |
|
| 65 | - $descriptif = propre($row['descriptif']); |
|
| 66 | - |
|
| 67 | - if ($voir_logo) { |
|
| 68 | - if ($logo = $chercher_logo($id_rubrique, 'id_rubrique', 'on')) { |
|
| 69 | - [$fid, $dir, $nom, $format] = $logo; |
|
| 70 | - $logo = image_recadre_avec_fallback("<img src='$fid' alt='' />", 70, 70); |
|
| 71 | - if ($logo) { |
|
| 72 | - $logo = wrap(inserer_attribut($logo, 'class', 'logo'), '<span class="logo-carre">'); |
|
| 73 | - } |
|
| 74 | - } |
|
| 75 | - } |
|
| 76 | - |
|
| 77 | - $lib_bouton = (!acces_restreint_rubrique($id_rubrique) ? '' : |
|
| 78 | - http_img_pack( |
|
| 79 | - 'auteur-0minirezo-16.png', |
|
| 80 | - '', |
|
| 81 | - " width='16' height='16'", |
|
| 82 | - _T('image_administrer_rubrique') |
|
| 83 | - )) . |
|
| 84 | - " <a class='titremlien' dir='$lang_dir'" . |
|
| 85 | - ($row['lang'] !== $GLOBALS['spip_lang'] ? " hreflang='" . $row['lang'] . "'" : '') . |
|
| 86 | - " href='" . |
|
| 87 | - generer_objet_url($id_rubrique, 'rubrique') . |
|
| 88 | - "'><span class='titre'>" . |
|
| 89 | - $rang . $titre |
|
| 90 | - . '</span>' |
|
| 91 | - . (is_string($logo) ? $logo : '') |
|
| 92 | - . '</a>'; |
|
| 93 | - |
|
| 94 | - $titre = bouton_block_depliable($lib_bouton, $les_sous_enfants ? false : -1, "enfants$id_rubrique") |
|
| 95 | - . (!$descriptif ? '' : "\n<div class='descriptif'>$descriptif</div>") |
|
| 96 | - ; |
|
| 97 | - |
|
| 98 | - $res[] = |
|
| 99 | - debut_cadre_sous_rub(($id_parent ? 'rubrique-24.png' : 'secteur-24.png'), true, '', $titre) . |
|
| 100 | - $les_sous_enfants . |
|
| 101 | - fin_cadre_sous_rub(); |
|
| 102 | - } |
|
| 103 | - } |
|
| 104 | - |
|
| 105 | - changer_typo($GLOBALS['spip_lang']); # remettre la typo de l'interface pour la suite |
|
| 106 | - return $res; |
|
| 33 | + $voir_logo = (isset($GLOBALS['meta']['image_process']) and $GLOBALS['meta']['image_process'] != 'non'); |
|
| 34 | + $logo = ''; |
|
| 35 | + |
|
| 36 | + if ($voir_logo) { |
|
| 37 | + $chercher_logo = charger_fonction('chercher_logo', 'inc'); |
|
| 38 | + include_spip('inc/filtres_images_mini'); |
|
| 39 | + } |
|
| 40 | + |
|
| 41 | + $res = []; |
|
| 42 | + |
|
| 43 | + $result = sql_select( |
|
| 44 | + 'id_rubrique, id_parent, titre, descriptif, lang', |
|
| 45 | + 'spip_rubriques', |
|
| 46 | + 'id_parent=' . intval($collection), |
|
| 47 | + '', |
|
| 48 | + '0+titre,titre', |
|
| 49 | + $debut == -1 ? '' : "$debut,$limite" |
|
| 50 | + ); |
|
| 51 | + while ($row = sql_fetch($result)) { |
|
| 52 | + $id_rubrique = $row['id_rubrique']; |
|
| 53 | + $id_parent = $row['id_parent']; |
|
| 54 | + // pour etre sur de passer par tous les traitements |
|
| 55 | + $titre = generer_objet_info($id_rubrique, 'rubrique', 'titre'); |
|
| 56 | + if ('' !== ($rang = recuperer_numero($row['titre']))) { |
|
| 57 | + $rang = "<span class='rang'>$rang.</span> "; |
|
| 58 | + } |
|
| 59 | + |
|
| 60 | + if (autoriser('voir', 'rubrique', $id_rubrique)) { |
|
| 61 | + $les_sous_enfants = sous_enfant_rub($id_rubrique); |
|
| 62 | + |
|
| 63 | + changer_typo($row['lang']); |
|
| 64 | + $lang_dir = lang_dir($row['lang']); |
|
| 65 | + $descriptif = propre($row['descriptif']); |
|
| 66 | + |
|
| 67 | + if ($voir_logo) { |
|
| 68 | + if ($logo = $chercher_logo($id_rubrique, 'id_rubrique', 'on')) { |
|
| 69 | + [$fid, $dir, $nom, $format] = $logo; |
|
| 70 | + $logo = image_recadre_avec_fallback("<img src='$fid' alt='' />", 70, 70); |
|
| 71 | + if ($logo) { |
|
| 72 | + $logo = wrap(inserer_attribut($logo, 'class', 'logo'), '<span class="logo-carre">'); |
|
| 73 | + } |
|
| 74 | + } |
|
| 75 | + } |
|
| 76 | + |
|
| 77 | + $lib_bouton = (!acces_restreint_rubrique($id_rubrique) ? '' : |
|
| 78 | + http_img_pack( |
|
| 79 | + 'auteur-0minirezo-16.png', |
|
| 80 | + '', |
|
| 81 | + " width='16' height='16'", |
|
| 82 | + _T('image_administrer_rubrique') |
|
| 83 | + )) . |
|
| 84 | + " <a class='titremlien' dir='$lang_dir'" . |
|
| 85 | + ($row['lang'] !== $GLOBALS['spip_lang'] ? " hreflang='" . $row['lang'] . "'" : '') . |
|
| 86 | + " href='" . |
|
| 87 | + generer_objet_url($id_rubrique, 'rubrique') . |
|
| 88 | + "'><span class='titre'>" . |
|
| 89 | + $rang . $titre |
|
| 90 | + . '</span>' |
|
| 91 | + . (is_string($logo) ? $logo : '') |
|
| 92 | + . '</a>'; |
|
| 93 | + |
|
| 94 | + $titre = bouton_block_depliable($lib_bouton, $les_sous_enfants ? false : -1, "enfants$id_rubrique") |
|
| 95 | + . (!$descriptif ? '' : "\n<div class='descriptif'>$descriptif</div>") |
|
| 96 | + ; |
|
| 97 | + |
|
| 98 | + $res[] = |
|
| 99 | + debut_cadre_sous_rub(($id_parent ? 'rubrique-24.png' : 'secteur-24.png'), true, '', $titre) . |
|
| 100 | + $les_sous_enfants . |
|
| 101 | + fin_cadre_sous_rub(); |
|
| 102 | + } |
|
| 103 | + } |
|
| 104 | + |
|
| 105 | + changer_typo($GLOBALS['spip_lang']); # remettre la typo de l'interface pour la suite |
|
| 106 | + return $res; |
|
| 107 | 107 | } |
| 108 | 108 | |
| 109 | 109 | /** |
@@ -116,71 +116,71 @@ discard block |
||
| 116 | 116 | * Le contenu du bloc dépliable |
| 117 | 117 | */ |
| 118 | 118 | function sous_enfant_rub($collection2) { |
| 119 | - $nb = sql_countsel('spip_rubriques', 'id_parent=' . intval($collection2)); |
|
| 120 | - |
|
| 121 | - $retour = ''; |
|
| 122 | - $pagination = ''; |
|
| 123 | - $debut = 0; |
|
| 124 | - $limite = 500; |
|
| 125 | - |
|
| 126 | - /** |
|
| 127 | - * On ne va afficher que 500 résultats max |
|
| 128 | - * Si > 500 on affiche une pagination |
|
| 129 | - */ |
|
| 130 | - if ($nb > $limite) { |
|
| 131 | - $debut = _request('debut_rubrique' . $collection2) ?: $debut; |
|
| 132 | - $pagination = chercher_filtre('pagination'); |
|
| 133 | - $pagination = '<nav class="pagination">' . $pagination( |
|
| 134 | - $nb, |
|
| 135 | - '_rubrique' . $collection2, |
|
| 136 | - $debut, |
|
| 137 | - $limite, |
|
| 138 | - true, |
|
| 139 | - 'prive' |
|
| 140 | - ) . '</nav>'; |
|
| 141 | - $limite = $debut + $limite; |
|
| 142 | - } |
|
| 143 | - |
|
| 144 | - $result = sql_select( |
|
| 145 | - 'id_rubrique, id_parent, titre, lang', |
|
| 146 | - 'spip_rubriques', |
|
| 147 | - 'id_parent=' . intval($collection2), |
|
| 148 | - '', |
|
| 149 | - '0+titre,titre', |
|
| 150 | - $debut == -1 ? '' : "$debut,$limite" |
|
| 151 | - ); |
|
| 152 | - |
|
| 153 | - while ($row = sql_fetch($result)) { |
|
| 154 | - $id_rubrique2 = $row['id_rubrique']; |
|
| 155 | - $titre2 = generer_objet_info( |
|
| 156 | - $id_rubrique2, |
|
| 157 | - 'rubrique', |
|
| 158 | - 'titre' |
|
| 159 | - ); // pour etre sur de passer par tous les traitements |
|
| 160 | - if ('' !== ($rang2 = recuperer_numero($row['titre']))) { |
|
| 161 | - $rang2 = "<span class='rang'>$rang2.</span> "; |
|
| 162 | - } |
|
| 163 | - |
|
| 164 | - changer_typo($row['lang']); |
|
| 165 | - $lang_dir = lang_dir($row['lang']); |
|
| 166 | - if (autoriser('voir', 'rubrique', $id_rubrique2)) { |
|
| 167 | - $retour .= "\n<li class='item' dir='$lang_dir'><a href='" . generer_objet_url( |
|
| 168 | - $id_rubrique2, |
|
| 169 | - 'rubrique' |
|
| 170 | - ) . "'>" . $rang2 . $titre2 . "</a></li>\n"; |
|
| 171 | - } |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - $retour = $pagination . $retour . $pagination; |
|
| 175 | - |
|
| 176 | - if (!$retour) { |
|
| 177 | - return ''; |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - return debut_block_depliable($debut > 0 ? true : false, "enfants$collection2") |
|
| 181 | - . "\n<ul class='liste-items sous-sous-rub'>\n" |
|
| 182 | - . $retour |
|
| 183 | - . "</ul>\n" . fin_block() . "\n\n"; |
|
| 119 | + $nb = sql_countsel('spip_rubriques', 'id_parent=' . intval($collection2)); |
|
| 120 | + |
|
| 121 | + $retour = ''; |
|
| 122 | + $pagination = ''; |
|
| 123 | + $debut = 0; |
|
| 124 | + $limite = 500; |
|
| 125 | + |
|
| 126 | + /** |
|
| 127 | + * On ne va afficher que 500 résultats max |
|
| 128 | + * Si > 500 on affiche une pagination |
|
| 129 | + */ |
|
| 130 | + if ($nb > $limite) { |
|
| 131 | + $debut = _request('debut_rubrique' . $collection2) ?: $debut; |
|
| 132 | + $pagination = chercher_filtre('pagination'); |
|
| 133 | + $pagination = '<nav class="pagination">' . $pagination( |
|
| 134 | + $nb, |
|
| 135 | + '_rubrique' . $collection2, |
|
| 136 | + $debut, |
|
| 137 | + $limite, |
|
| 138 | + true, |
|
| 139 | + 'prive' |
|
| 140 | + ) . '</nav>'; |
|
| 141 | + $limite = $debut + $limite; |
|
| 142 | + } |
|
| 143 | + |
|
| 144 | + $result = sql_select( |
|
| 145 | + 'id_rubrique, id_parent, titre, lang', |
|
| 146 | + 'spip_rubriques', |
|
| 147 | + 'id_parent=' . intval($collection2), |
|
| 148 | + '', |
|
| 149 | + '0+titre,titre', |
|
| 150 | + $debut == -1 ? '' : "$debut,$limite" |
|
| 151 | + ); |
|
| 152 | + |
|
| 153 | + while ($row = sql_fetch($result)) { |
|
| 154 | + $id_rubrique2 = $row['id_rubrique']; |
|
| 155 | + $titre2 = generer_objet_info( |
|
| 156 | + $id_rubrique2, |
|
| 157 | + 'rubrique', |
|
| 158 | + 'titre' |
|
| 159 | + ); // pour etre sur de passer par tous les traitements |
|
| 160 | + if ('' !== ($rang2 = recuperer_numero($row['titre']))) { |
|
| 161 | + $rang2 = "<span class='rang'>$rang2.</span> "; |
|
| 162 | + } |
|
| 163 | + |
|
| 164 | + changer_typo($row['lang']); |
|
| 165 | + $lang_dir = lang_dir($row['lang']); |
|
| 166 | + if (autoriser('voir', 'rubrique', $id_rubrique2)) { |
|
| 167 | + $retour .= "\n<li class='item' dir='$lang_dir'><a href='" . generer_objet_url( |
|
| 168 | + $id_rubrique2, |
|
| 169 | + 'rubrique' |
|
| 170 | + ) . "'>" . $rang2 . $titre2 . "</a></li>\n"; |
|
| 171 | + } |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + $retour = $pagination . $retour . $pagination; |
|
| 175 | + |
|
| 176 | + if (!$retour) { |
|
| 177 | + return ''; |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + return debut_block_depliable($debut > 0 ? true : false, "enfants$collection2") |
|
| 181 | + . "\n<ul class='liste-items sous-sous-rub'>\n" |
|
| 182 | + . $retour |
|
| 183 | + . "</ul>\n" . fin_block() . "\n\n"; |
|
| 184 | 184 | } |
| 185 | 185 | |
| 186 | 186 | /** |
@@ -195,44 +195,44 @@ discard block |
||
| 195 | 195 | * Le contenu textuel affiché, la liste des sous rubriques |
| 196 | 196 | */ |
| 197 | 197 | function afficher_enfant_rub($id_rubrique = 0) { |
| 198 | - $pagination = ''; |
|
| 199 | - $debut = 0; |
|
| 200 | - $limite = 500; |
|
| 201 | - |
|
| 202 | - $nb = sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique)); |
|
| 203 | - |
|
| 204 | - if ($nb > $limite) { |
|
| 205 | - $debut = _request('debut_rubrique' . $id_rubrique) ?: $debut; |
|
| 206 | - $pagination = chercher_filtre('pagination'); |
|
| 207 | - $pagination = '<br class="nettoyeur"><nav class="pagination">' . |
|
| 208 | - $pagination($nb, '_rubrique' . $id_rubrique, $debut, $limite, true, 'prive') . |
|
| 209 | - '</nav>'; |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - $les_enfants = enfant_rub($id_rubrique, $debut, $limite); |
|
| 213 | - |
|
| 214 | - if (!$n = count($les_enfants)) { |
|
| 215 | - return ''; |
|
| 216 | - } |
|
| 217 | - |
|
| 218 | - if ($n == 1) { |
|
| 219 | - $les_enfants = reset($les_enfants); |
|
| 220 | - $les_enfants2 = ''; |
|
| 221 | - } else { |
|
| 222 | - $n = ceil($n / 2); |
|
| 223 | - $les_enfants2 = implode('', array_slice($les_enfants, $n)); |
|
| 224 | - $les_enfants = implode('', array_slice($les_enfants, 0, $n)); |
|
| 225 | - } |
|
| 226 | - |
|
| 227 | - $res = |
|
| 228 | - $pagination |
|
| 229 | - . "<div class='gauche'>" |
|
| 230 | - . $les_enfants |
|
| 231 | - . '</div>' |
|
| 232 | - . "<div class='droite'>" |
|
| 233 | - . $les_enfants2 |
|
| 234 | - . '</div>' |
|
| 235 | - . $pagination; |
|
| 236 | - |
|
| 237 | - return $res; |
|
| 198 | + $pagination = ''; |
|
| 199 | + $debut = 0; |
|
| 200 | + $limite = 500; |
|
| 201 | + |
|
| 202 | + $nb = sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique)); |
|
| 203 | + |
|
| 204 | + if ($nb > $limite) { |
|
| 205 | + $debut = _request('debut_rubrique' . $id_rubrique) ?: $debut; |
|
| 206 | + $pagination = chercher_filtre('pagination'); |
|
| 207 | + $pagination = '<br class="nettoyeur"><nav class="pagination">' . |
|
| 208 | + $pagination($nb, '_rubrique' . $id_rubrique, $debut, $limite, true, 'prive') . |
|
| 209 | + '</nav>'; |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + $les_enfants = enfant_rub($id_rubrique, $debut, $limite); |
|
| 213 | + |
|
| 214 | + if (!$n = count($les_enfants)) { |
|
| 215 | + return ''; |
|
| 216 | + } |
|
| 217 | + |
|
| 218 | + if ($n == 1) { |
|
| 219 | + $les_enfants = reset($les_enfants); |
|
| 220 | + $les_enfants2 = ''; |
|
| 221 | + } else { |
|
| 222 | + $n = ceil($n / 2); |
|
| 223 | + $les_enfants2 = implode('', array_slice($les_enfants, $n)); |
|
| 224 | + $les_enfants = implode('', array_slice($les_enfants, 0, $n)); |
|
| 225 | + } |
|
| 226 | + |
|
| 227 | + $res = |
|
| 228 | + $pagination |
|
| 229 | + . "<div class='gauche'>" |
|
| 230 | + . $les_enfants |
|
| 231 | + . '</div>' |
|
| 232 | + . "<div class='droite'>" |
|
| 233 | + . $les_enfants2 |
|
| 234 | + . '</div>' |
|
| 235 | + . $pagination; |
|
| 236 | + |
|
| 237 | + return $res; |
|
| 238 | 238 | } |
@@ -11,129 +11,129 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | // Decompilation de l'arbre de syntaxe abstraite d'un squelette SPIP |
| 18 | 18 | |
| 19 | 19 | function decompiler_boucle($struct, $fmt = '', $prof = 0) { |
| 20 | - $nom = $struct->id_boucle; |
|
| 21 | - $preaff = decompiler_($struct->preaff, $fmt, $prof); |
|
| 22 | - $avant = decompiler_($struct->avant, $fmt, $prof); |
|
| 23 | - $apres = decompiler_($struct->apres, $fmt, $prof); |
|
| 24 | - $altern = decompiler_($struct->altern, $fmt, $prof); |
|
| 25 | - $milieu = decompiler_($struct->milieu, $fmt, $prof); |
|
| 26 | - $postaff = decompiler_($struct->postaff, $fmt, $prof); |
|
| 27 | - |
|
| 28 | - $type = $struct->sql_serveur ? "$struct->sql_serveur:" : ''; |
|
| 29 | - $type .= ($struct->type_requete ?: $struct->table_optionnelle); |
|
| 30 | - |
|
| 31 | - if ($struct->jointures_explicites) { |
|
| 32 | - $type .= ' ' . $struct->jointures_explicites; |
|
| 33 | - } |
|
| 34 | - if ($struct->table_optionnelle) { |
|
| 35 | - $type .= '?'; |
|
| 36 | - } |
|
| 37 | - // Revoir le cas de la boucle recursive |
|
| 38 | - |
|
| 39 | - $crit = $struct->param; |
|
| 40 | - if ($crit and !is_array($crit[0])) { |
|
| 41 | - $type = strtolower($type) . array_shift($crit); |
|
| 42 | - } |
|
| 43 | - $crit = decompiler_criteres($struct, $fmt, $prof); |
|
| 44 | - |
|
| 45 | - $f = 'format_boucle_' . $fmt; |
|
| 46 | - |
|
| 47 | - return $f($preaff, $avant, $nom, $type, $crit, $milieu, $apres, $altern, $postaff, $prof); |
|
| 20 | + $nom = $struct->id_boucle; |
|
| 21 | + $preaff = decompiler_($struct->preaff, $fmt, $prof); |
|
| 22 | + $avant = decompiler_($struct->avant, $fmt, $prof); |
|
| 23 | + $apres = decompiler_($struct->apres, $fmt, $prof); |
|
| 24 | + $altern = decompiler_($struct->altern, $fmt, $prof); |
|
| 25 | + $milieu = decompiler_($struct->milieu, $fmt, $prof); |
|
| 26 | + $postaff = decompiler_($struct->postaff, $fmt, $prof); |
|
| 27 | + |
|
| 28 | + $type = $struct->sql_serveur ? "$struct->sql_serveur:" : ''; |
|
| 29 | + $type .= ($struct->type_requete ?: $struct->table_optionnelle); |
|
| 30 | + |
|
| 31 | + if ($struct->jointures_explicites) { |
|
| 32 | + $type .= ' ' . $struct->jointures_explicites; |
|
| 33 | + } |
|
| 34 | + if ($struct->table_optionnelle) { |
|
| 35 | + $type .= '?'; |
|
| 36 | + } |
|
| 37 | + // Revoir le cas de la boucle recursive |
|
| 38 | + |
|
| 39 | + $crit = $struct->param; |
|
| 40 | + if ($crit and !is_array($crit[0])) { |
|
| 41 | + $type = strtolower($type) . array_shift($crit); |
|
| 42 | + } |
|
| 43 | + $crit = decompiler_criteres($struct, $fmt, $prof); |
|
| 44 | + |
|
| 45 | + $f = 'format_boucle_' . $fmt; |
|
| 46 | + |
|
| 47 | + return $f($preaff, $avant, $nom, $type, $crit, $milieu, $apres, $altern, $postaff, $prof); |
|
| 48 | 48 | } |
| 49 | 49 | |
| 50 | 50 | function decompiler_include($struct, $fmt = '', $prof = 0) { |
| 51 | - $res = []; |
|
| 52 | - foreach ($struct->param ?: [] as $couple) { |
|
| 53 | - array_shift($couple); |
|
| 54 | - foreach ($couple as $v) { |
|
| 55 | - $res[] = decompiler_($v, $fmt, $prof); |
|
| 56 | - } |
|
| 57 | - } |
|
| 58 | - $file = is_string($struct->texte) ? $struct->texte : |
|
| 59 | - decompiler_($struct->texte, $fmt, $prof); |
|
| 60 | - $f = 'format_inclure_' . $fmt; |
|
| 61 | - |
|
| 62 | - return $f($file, $res, $prof); |
|
| 51 | + $res = []; |
|
| 52 | + foreach ($struct->param ?: [] as $couple) { |
|
| 53 | + array_shift($couple); |
|
| 54 | + foreach ($couple as $v) { |
|
| 55 | + $res[] = decompiler_($v, $fmt, $prof); |
|
| 56 | + } |
|
| 57 | + } |
|
| 58 | + $file = is_string($struct->texte) ? $struct->texte : |
|
| 59 | + decompiler_($struct->texte, $fmt, $prof); |
|
| 60 | + $f = 'format_inclure_' . $fmt; |
|
| 61 | + |
|
| 62 | + return $f($file, $res, $prof); |
|
| 63 | 63 | } |
| 64 | 64 | |
| 65 | 65 | function decompiler_texte($struct, $fmt = '', $prof = 0) { |
| 66 | - $f = 'format_texte_' . $fmt; |
|
| 66 | + $f = 'format_texte_' . $fmt; |
|
| 67 | 67 | |
| 68 | - return strlen($struct->texte) ? $f($struct->texte, $prof) : ''; |
|
| 68 | + return strlen($struct->texte) ? $f($struct->texte, $prof) : ''; |
|
| 69 | 69 | } |
| 70 | 70 | |
| 71 | 71 | function decompiler_polyglotte($struct, $fmt = '', $prof = 0) { |
| 72 | - $f = 'format_polyglotte_' . $fmt; |
|
| 72 | + $f = 'format_polyglotte_' . $fmt; |
|
| 73 | 73 | |
| 74 | - return $f($struct->traductions, $prof); |
|
| 74 | + return $f($struct->traductions, $prof); |
|
| 75 | 75 | } |
| 76 | 76 | |
| 77 | 77 | function decompiler_idiome($struct, $fmt = '', $prof = 0) { |
| 78 | - $args = []; |
|
| 79 | - foreach ($struct->arg as $k => $v) { |
|
| 80 | - $args[$k] = public_decompiler($v, $fmt, $prof); |
|
| 81 | - } |
|
| 78 | + $args = []; |
|
| 79 | + foreach ($struct->arg as $k => $v) { |
|
| 80 | + $args[$k] = public_decompiler($v, $fmt, $prof); |
|
| 81 | + } |
|
| 82 | 82 | |
| 83 | - $filtres = decompiler_liste($struct->param, $fmt, $prof); |
|
| 83 | + $filtres = decompiler_liste($struct->param, $fmt, $prof); |
|
| 84 | 84 | |
| 85 | - $f = 'format_idiome_' . $fmt; |
|
| 85 | + $f = 'format_idiome_' . $fmt; |
|
| 86 | 86 | |
| 87 | - return $f($struct->nom_champ, $struct->module, $args, $filtres, $prof); |
|
| 87 | + return $f($struct->nom_champ, $struct->module, $args, $filtres, $prof); |
|
| 88 | 88 | } |
| 89 | 89 | |
| 90 | 90 | function decompiler_champ($struct, $fmt = '', $prof = 0) { |
| 91 | - $avant = decompiler_($struct->avant, $fmt, $prof); |
|
| 92 | - $apres = decompiler_($struct->apres, $fmt, $prof); |
|
| 93 | - $args = $filtres = ''; |
|
| 94 | - if ($p = $struct->param) { |
|
| 95 | - if ($p[0][0] === '') { |
|
| 96 | - $args = decompiler_liste([array_shift($p)], $fmt, $prof); |
|
| 97 | - } |
|
| 98 | - $filtres = decompiler_liste($p, $fmt, $prof); |
|
| 99 | - } |
|
| 100 | - $f = 'format_champ_' . $fmt; |
|
| 101 | - |
|
| 102 | - return $f($struct->nom_champ, $struct->nom_boucle, $struct->etoile, $avant, $apres, $args, $filtres, $prof); |
|
| 91 | + $avant = decompiler_($struct->avant, $fmt, $prof); |
|
| 92 | + $apres = decompiler_($struct->apres, $fmt, $prof); |
|
| 93 | + $args = $filtres = ''; |
|
| 94 | + if ($p = $struct->param) { |
|
| 95 | + if ($p[0][0] === '') { |
|
| 96 | + $args = decompiler_liste([array_shift($p)], $fmt, $prof); |
|
| 97 | + } |
|
| 98 | + $filtres = decompiler_liste($p, $fmt, $prof); |
|
| 99 | + } |
|
| 100 | + $f = 'format_champ_' . $fmt; |
|
| 101 | + |
|
| 102 | + return $f($struct->nom_champ, $struct->nom_boucle, $struct->etoile, $avant, $apres, $args, $filtres, $prof); |
|
| 103 | 103 | } |
| 104 | 104 | |
| 105 | 105 | function decompiler_liste($sources, $fmt = '', $prof = 0) { |
| 106 | - if (!is_array($sources)) { |
|
| 107 | - return ''; |
|
| 108 | - } |
|
| 109 | - $f = 'format_liste_' . $fmt; |
|
| 110 | - $res = ''; |
|
| 111 | - foreach ($sources as $arg) { |
|
| 112 | - if (!is_array($arg)) { |
|
| 113 | - continue; // ne devrait pas arriver. |
|
| 114 | - } else { |
|
| 115 | - $r = array_shift($arg); |
|
| 116 | - } |
|
| 117 | - $args = []; |
|
| 118 | - foreach ($arg as $v) { |
|
| 119 | - // cas des arguments entoures de ' ou " |
|
| 120 | - if ( |
|
| 121 | - ((is_countable($v) ? count($v) : 0) == 1) |
|
| 122 | - and $v[0]->type == 'texte' |
|
| 123 | - and (strlen($v[0]->apres) == 1) |
|
| 124 | - and $v[0]->apres == $v[0]->avant |
|
| 125 | - ) { |
|
| 126 | - $args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres; |
|
| 127 | - } else { |
|
| 128 | - $args[] = decompiler_($v, $fmt, 0 - $prof); |
|
| 129 | - } |
|
| 130 | - } |
|
| 131 | - if (($r !== '') or $args) { |
|
| 132 | - $res .= $f($r, $args, $prof); |
|
| 133 | - } |
|
| 134 | - } |
|
| 135 | - |
|
| 136 | - return $res; |
|
| 106 | + if (!is_array($sources)) { |
|
| 107 | + return ''; |
|
| 108 | + } |
|
| 109 | + $f = 'format_liste_' . $fmt; |
|
| 110 | + $res = ''; |
|
| 111 | + foreach ($sources as $arg) { |
|
| 112 | + if (!is_array($arg)) { |
|
| 113 | + continue; // ne devrait pas arriver. |
|
| 114 | + } else { |
|
| 115 | + $r = array_shift($arg); |
|
| 116 | + } |
|
| 117 | + $args = []; |
|
| 118 | + foreach ($arg as $v) { |
|
| 119 | + // cas des arguments entoures de ' ou " |
|
| 120 | + if ( |
|
| 121 | + ((is_countable($v) ? count($v) : 0) == 1) |
|
| 122 | + and $v[0]->type == 'texte' |
|
| 123 | + and (strlen($v[0]->apres) == 1) |
|
| 124 | + and $v[0]->apres == $v[0]->avant |
|
| 125 | + ) { |
|
| 126 | + $args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres; |
|
| 127 | + } else { |
|
| 128 | + $args[] = decompiler_($v, $fmt, 0 - $prof); |
|
| 129 | + } |
|
| 130 | + } |
|
| 131 | + if (($r !== '') or $args) { |
|
| 132 | + $res .= $f($r, $args, $prof); |
|
| 133 | + } |
|
| 134 | + } |
|
| 135 | + |
|
| 136 | + return $res; |
|
| 137 | 137 | } |
| 138 | 138 | |
| 139 | 139 | // Decompilation des criteres: on triche et on deroge: |
@@ -141,93 +141,93 @@ discard block |
||
| 141 | 141 | // - le champ apres signale le critere {"separateur"} ou {'separateur'} |
| 142 | 142 | // - les champs sont implicitement etendus (crochets implicites mais interdits) |
| 143 | 143 | function decompiler_criteres($boucle, $fmt = '', $prof = 0) { |
| 144 | - $sources = $boucle->param; |
|
| 145 | - if (!is_array($sources)) { |
|
| 146 | - return ''; |
|
| 147 | - } |
|
| 148 | - $res = ''; |
|
| 149 | - $f = 'format_critere_' . $fmt; |
|
| 150 | - foreach ($sources as $crit) { |
|
| 151 | - if (!is_array($crit)) { |
|
| 152 | - continue; |
|
| 153 | - } // boucle recursive |
|
| 154 | - array_shift($crit); |
|
| 155 | - $args = []; |
|
| 156 | - foreach ($crit as $i => $v) { |
|
| 157 | - if ( |
|
| 158 | - ((is_countable($v) ? count($v) : 0) == 1) |
|
| 159 | - and $v[0]->type == 'texte' |
|
| 160 | - and $v[0]->apres |
|
| 161 | - ) { |
|
| 162 | - $args[] = [['texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres)]]; |
|
| 163 | - } else { |
|
| 164 | - $res2 = []; |
|
| 165 | - foreach ($v as $k => $p) { |
|
| 166 | - if ( |
|
| 167 | - isset($p->type) |
|
| 168 | - and function_exists($d = 'decompiler_' . $p->type) |
|
| 169 | - ) { |
|
| 170 | - $r = $d($p, $fmt, (0 - $prof)); |
|
| 171 | - $res2[] = [$p->type, $r]; |
|
| 172 | - } else { |
|
| 173 | - spip_log("critere $i / $k mal forme"); |
|
| 174 | - } |
|
| 175 | - } |
|
| 176 | - $args[] = $res2; |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - $res .= $f($args); |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - return $res; |
|
| 144 | + $sources = $boucle->param; |
|
| 145 | + if (!is_array($sources)) { |
|
| 146 | + return ''; |
|
| 147 | + } |
|
| 148 | + $res = ''; |
|
| 149 | + $f = 'format_critere_' . $fmt; |
|
| 150 | + foreach ($sources as $crit) { |
|
| 151 | + if (!is_array($crit)) { |
|
| 152 | + continue; |
|
| 153 | + } // boucle recursive |
|
| 154 | + array_shift($crit); |
|
| 155 | + $args = []; |
|
| 156 | + foreach ($crit as $i => $v) { |
|
| 157 | + if ( |
|
| 158 | + ((is_countable($v) ? count($v) : 0) == 1) |
|
| 159 | + and $v[0]->type == 'texte' |
|
| 160 | + and $v[0]->apres |
|
| 161 | + ) { |
|
| 162 | + $args[] = [['texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres)]]; |
|
| 163 | + } else { |
|
| 164 | + $res2 = []; |
|
| 165 | + foreach ($v as $k => $p) { |
|
| 166 | + if ( |
|
| 167 | + isset($p->type) |
|
| 168 | + and function_exists($d = 'decompiler_' . $p->type) |
|
| 169 | + ) { |
|
| 170 | + $r = $d($p, $fmt, (0 - $prof)); |
|
| 171 | + $res2[] = [$p->type, $r]; |
|
| 172 | + } else { |
|
| 173 | + spip_log("critere $i / $k mal forme"); |
|
| 174 | + } |
|
| 175 | + } |
|
| 176 | + $args[] = $res2; |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + $res .= $f($args); |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + return $res; |
|
| 183 | 183 | } |
| 184 | 184 | |
| 185 | 185 | |
| 186 | 186 | function decompiler_($liste, $fmt = '', $prof = 0) { |
| 187 | - if (!is_array($liste)) { |
|
| 188 | - return ''; |
|
| 189 | - } |
|
| 190 | - $prof2 = ($prof < 0) ? ($prof - 1) : ($prof + 1); |
|
| 191 | - $contenu = []; |
|
| 192 | - foreach ($liste as $k => $p) { |
|
| 193 | - if (!isset($p->type)) { |
|
| 194 | - continue; |
|
| 195 | - } #?????? |
|
| 196 | - $d = 'decompiler_' . $p->type; |
|
| 197 | - $next = $liste[$k + 1] ?? false; |
|
| 198 | - // Forcer le champ etendu si son source (pas les reecritures) |
|
| 199 | - // contenait des args et s'il est suivi d'espaces, |
|
| 200 | - // le champ simple les eliminant est un bug helas perenne. |
|
| 201 | - |
|
| 202 | - if ( |
|
| 203 | - $next |
|
| 204 | - and ($next->type == 'texte') |
|
| 205 | - and $p->type == 'champ' |
|
| 206 | - and !$p->apres |
|
| 207 | - and !$p->avant |
|
| 208 | - and $p->fonctions |
|
| 209 | - ) { |
|
| 210 | - $n = strlen($next->texte) - strlen(ltrim($next->texte)); |
|
| 211 | - if ($n) { |
|
| 212 | - $champ = new Texte(); |
|
| 213 | - $champ->texte = substr($next->texte, 0, $n); |
|
| 214 | - $champ->ligne = $p->ligne; |
|
| 215 | - $p->apres = [$champ]; |
|
| 216 | - $next->texte = substr($next->texte, $n); |
|
| 217 | - } |
|
| 218 | - } |
|
| 219 | - $contenu[] = [$d($p, $fmt, $prof2), $p->type]; |
|
| 220 | - } |
|
| 221 | - $f = 'format_suite_' . $fmt; |
|
| 222 | - |
|
| 223 | - return $f($contenu); |
|
| 187 | + if (!is_array($liste)) { |
|
| 188 | + return ''; |
|
| 189 | + } |
|
| 190 | + $prof2 = ($prof < 0) ? ($prof - 1) : ($prof + 1); |
|
| 191 | + $contenu = []; |
|
| 192 | + foreach ($liste as $k => $p) { |
|
| 193 | + if (!isset($p->type)) { |
|
| 194 | + continue; |
|
| 195 | + } #?????? |
|
| 196 | + $d = 'decompiler_' . $p->type; |
|
| 197 | + $next = $liste[$k + 1] ?? false; |
|
| 198 | + // Forcer le champ etendu si son source (pas les reecritures) |
|
| 199 | + // contenait des args et s'il est suivi d'espaces, |
|
| 200 | + // le champ simple les eliminant est un bug helas perenne. |
|
| 201 | + |
|
| 202 | + if ( |
|
| 203 | + $next |
|
| 204 | + and ($next->type == 'texte') |
|
| 205 | + and $p->type == 'champ' |
|
| 206 | + and !$p->apres |
|
| 207 | + and !$p->avant |
|
| 208 | + and $p->fonctions |
|
| 209 | + ) { |
|
| 210 | + $n = strlen($next->texte) - strlen(ltrim($next->texte)); |
|
| 211 | + if ($n) { |
|
| 212 | + $champ = new Texte(); |
|
| 213 | + $champ->texte = substr($next->texte, 0, $n); |
|
| 214 | + $champ->ligne = $p->ligne; |
|
| 215 | + $p->apres = [$champ]; |
|
| 216 | + $next->texte = substr($next->texte, $n); |
|
| 217 | + } |
|
| 218 | + } |
|
| 219 | + $contenu[] = [$d($p, $fmt, $prof2), $p->type]; |
|
| 220 | + } |
|
| 221 | + $f = 'format_suite_' . $fmt; |
|
| 222 | + |
|
| 223 | + return $f($contenu); |
|
| 224 | 224 | } |
| 225 | 225 | |
| 226 | 226 | function public_decompiler($liste, $fmt = '', $prof = 0, $quoi = '') { |
| 227 | - if (!include_spip('public/format_' . $fmt)) { |
|
| 228 | - return "'$fmt'?"; |
|
| 229 | - } |
|
| 230 | - $f = 'decompiler_' . $quoi; |
|
| 227 | + if (!include_spip('public/format_' . $fmt)) { |
|
| 228 | + return "'$fmt'?"; |
|
| 229 | + } |
|
| 230 | + $f = 'decompiler_' . $quoi; |
|
| 231 | 231 | |
| 232 | - return $f($liste, $fmt, $prof); |
|
| 232 | + return $f($liste, $fmt, $prof); |
|
| 233 | 233 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | include_fichiers_fonctions(); |
@@ -30,177 +30,177 @@ discard block |
||
| 30 | 30 | # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines |
| 31 | 31 | |
| 32 | 32 | function public_parametrer_dist($fond, $contexte = '', $cache = '', string $connect = '') { |
| 33 | - static $composer, $styliser, $notes = null; |
|
| 34 | - $page = tester_redirection($fond, $contexte, $connect); |
|
| 35 | - if ($page) { |
|
| 36 | - return $page; |
|
| 37 | - } |
|
| 38 | - |
|
| 39 | - if (isset($contexte['lang'])) { |
|
| 40 | - $lang = $contexte['lang']; |
|
| 41 | - } elseif (!isset($lang)) { |
|
| 42 | - $lang = $GLOBALS['meta']['langue_site']; |
|
| 43 | - } |
|
| 44 | - |
|
| 45 | - $select = ((!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang']) and $lang <> $GLOBALS['spip_lang']); |
|
| 46 | - if ($select) { |
|
| 47 | - $select = lang_select($lang); |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); |
|
| 51 | - |
|
| 52 | - if (!$styliser) { |
|
| 53 | - $styliser = charger_fonction('styliser', 'public'); |
|
| 54 | - } |
|
| 55 | - [$skel, $mime_type, $gram, $sourcefile] = |
|
| 56 | - $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); |
|
| 57 | - |
|
| 58 | - if ($skel) { |
|
| 59 | - // sauver le nom de l'eventuel squelette en cours d'execution |
|
| 60 | - // (recursion possible a cause des modeles) |
|
| 61 | - if ($debug) { |
|
| 62 | - $courant = $GLOBALS['debug_objets']['courant'] ?? null; |
|
| 63 | - $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - // charger le squelette en specifiant les langages cibles et source |
|
| 67 | - // au cas il faudrait le compiler (source posterieure au resultat) |
|
| 68 | - |
|
| 69 | - if (!$composer) { |
|
| 70 | - $composer = charger_fonction('composer', 'public'); |
|
| 71 | - } |
|
| 72 | - $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); |
|
| 73 | - } else { |
|
| 74 | - $fonc = ''; |
|
| 75 | - } |
|
| 76 | - |
|
| 77 | - if (!$fonc) { // squelette inconnu (==='') ou faux (===false) |
|
| 78 | - $page = $fonc; |
|
| 79 | - } else { |
|
| 80 | - // Preparer l'appel de la fonction principale du squelette |
|
| 81 | - |
|
| 82 | - spip_timer($a = 'calcul page ' . random_int(0, 1000)); |
|
| 83 | - |
|
| 84 | - // On cree un marqueur de notes unique lie a cette composition |
|
| 85 | - // et on enregistre l'etat courant des globales de notes... |
|
| 86 | - if (is_null($notes)) { |
|
| 87 | - $notes = charger_fonction('notes', 'inc', true); |
|
| 88 | - } |
|
| 89 | - if ($notes) { |
|
| 90 | - $notes('', 'empiler'); |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - // Rajouter d'office ces deux parametres |
|
| 94 | - // (mais vaudrait mieux que le compilateur sache le simuler |
|
| 95 | - // car ca interdit l'usage de criteres conditionnels dessus). |
|
| 96 | - if (!isset($contexte['date'])) { |
|
| 97 | - $contexte['date'] = date('Y-m-d H:i:s'); |
|
| 98 | - $contexte['date_default'] = true; |
|
| 99 | - } else { |
|
| 100 | - $contexte['date'] = normaliser_date($contexte['date'], true); |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - if (!isset($contexte['date_redac'])) { |
|
| 104 | - $contexte['date_redac'] = date('Y-m-d H:i:s'); |
|
| 105 | - $contexte['date_redac_default'] = true; |
|
| 106 | - } else { |
|
| 107 | - $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - // Passer le nom du cache pour produire sa destruction automatique |
|
| 111 | - try { |
|
| 112 | - $page = $fonc(['cache' => $cache], [$contexte]); |
|
| 113 | - } catch (Throwable $e) { |
|
| 114 | - $msg = _T('zbug_erreur_execution_page') . " $sourcefile"; |
|
| 115 | - $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 116 | - $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg); |
|
| 117 | - $corps = "<pre>$msg</pre>"; |
|
| 118 | - $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile); |
|
| 119 | - erreur_squelette($full_msg); |
|
| 120 | - unset($msg, $full_msg, $corps); |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - // Restituer les globales de notes telles qu'elles etaient avant l'appel |
|
| 124 | - // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* |
|
| 125 | - // etre dans son resultat, autrement elles ne seraient pas prises en |
|
| 126 | - // compte a chaque calcul d'un texte contenant un modele, mais seulement |
|
| 127 | - // quand le modele serait calcule, et on aurait des resultats incoherents) |
|
| 128 | - if ($notes) { |
|
| 129 | - $notes('', 'depiler'); |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - // reinjecter en dynamique la pile des notes |
|
| 133 | - // si il y a des inclure dynamiques |
|
| 134 | - // si la pile n'est pas vide |
|
| 135 | - // la generalisation de cette injection permettrait de corriger le point juste au dessus |
|
| 136 | - // en faisant remonter les notes a l'incluant (A tester et valider avant application) |
|
| 137 | - if ($notes) { |
|
| 138 | - $page['notes'] = $notes('', 'sauver_etat'); |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - // spip_log: un joli contexte |
|
| 142 | - $infos = presenter_contexte(array_filter($contexte)); |
|
| 143 | - |
|
| 144 | - $profile = spip_timer($a); |
|
| 145 | - spip_log("calcul ($profile) [$skel] $infos" |
|
| 146 | - . ' (' . strlen($page['texte']) . ' octets)'); |
|
| 147 | - |
|
| 148 | - if (defined('_CALCUL_PROFILER') and intval($profile) > _CALCUL_PROFILER) { |
|
| 149 | - spip_log("calcul ($profile) [$skel] $infos" |
|
| 150 | - . ' (' . strlen($page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI'], 'profiler' . _LOG_AVERTISSEMENT); |
|
| 151 | - } |
|
| 152 | - |
|
| 153 | - if ($debug) { |
|
| 154 | - // si c'est ce que demande le debusqueur, lui passer la main |
|
| 155 | - $t = strlen($page['texte']) ? $page['texte'] : ' '; |
|
| 156 | - $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; |
|
| 157 | - $GLOBALS['debug_objets']['courant'] = $courant; |
|
| 158 | - $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; |
|
| 159 | - if ( |
|
| 160 | - $GLOBALS['debug_objets']['sourcefile'] |
|
| 161 | - and (_request('var_mode_objet') == $fonc) |
|
| 162 | - and (_request('var_mode_affiche') == 'resultat') |
|
| 163 | - ) { |
|
| 164 | - erreur_squelette(); |
|
| 165 | - } |
|
| 166 | - } |
|
| 167 | - // Si #CACHE{} n'etait pas la, le mettre a $delais |
|
| 168 | - if (!isset($page['entetes']['X-Spip-Cache'])) { |
|
| 169 | - // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut |
|
| 170 | - // si aucun #CACHE{} spécifié |
|
| 171 | - // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme |
|
| 172 | - // entre public et prive |
|
| 173 | - if (test_espace_prive() or strncmp($fond, 'modeles/', 8) == 0) { |
|
| 174 | - $page['entetes']['X-Spip-Cache'] = 0; |
|
| 175 | - } else { |
|
| 176 | - $page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000; |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - $page['contexte'] = $contexte; |
|
| 181 | - |
|
| 182 | - // faire remonter le fichier source |
|
| 183 | - static $js_inclus = false; |
|
| 184 | - if (defined('_VAR_INCLURE') and _VAR_INCLURE) { |
|
| 185 | - $page['sourcefile'] = $sourcefile; |
|
| 186 | - $page['texte'] = |
|
| 187 | - "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>' |
|
| 188 | - . ($js_inclus ? '' : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>"); |
|
| 189 | - $js_inclus = true; |
|
| 190 | - } |
|
| 191 | - |
|
| 192 | - // Si un modele contenait #SESSION, on note l'info dans $page |
|
| 193 | - if (isset($GLOBALS['cache_utilise_session'])) { |
|
| 194 | - $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session']; |
|
| 195 | - unset($GLOBALS['cache_utilise_session']); |
|
| 196 | - } |
|
| 197 | - } |
|
| 198 | - |
|
| 199 | - if ($select) { |
|
| 200 | - lang_select(); |
|
| 201 | - } |
|
| 202 | - |
|
| 203 | - return $page; |
|
| 33 | + static $composer, $styliser, $notes = null; |
|
| 34 | + $page = tester_redirection($fond, $contexte, $connect); |
|
| 35 | + if ($page) { |
|
| 36 | + return $page; |
|
| 37 | + } |
|
| 38 | + |
|
| 39 | + if (isset($contexte['lang'])) { |
|
| 40 | + $lang = $contexte['lang']; |
|
| 41 | + } elseif (!isset($lang)) { |
|
| 42 | + $lang = $GLOBALS['meta']['langue_site']; |
|
| 43 | + } |
|
| 44 | + |
|
| 45 | + $select = ((!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang']) and $lang <> $GLOBALS['spip_lang']); |
|
| 46 | + if ($select) { |
|
| 47 | + $select = lang_select($lang); |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); |
|
| 51 | + |
|
| 52 | + if (!$styliser) { |
|
| 53 | + $styliser = charger_fonction('styliser', 'public'); |
|
| 54 | + } |
|
| 55 | + [$skel, $mime_type, $gram, $sourcefile] = |
|
| 56 | + $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); |
|
| 57 | + |
|
| 58 | + if ($skel) { |
|
| 59 | + // sauver le nom de l'eventuel squelette en cours d'execution |
|
| 60 | + // (recursion possible a cause des modeles) |
|
| 61 | + if ($debug) { |
|
| 62 | + $courant = $GLOBALS['debug_objets']['courant'] ?? null; |
|
| 63 | + $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + // charger le squelette en specifiant les langages cibles et source |
|
| 67 | + // au cas il faudrait le compiler (source posterieure au resultat) |
|
| 68 | + |
|
| 69 | + if (!$composer) { |
|
| 70 | + $composer = charger_fonction('composer', 'public'); |
|
| 71 | + } |
|
| 72 | + $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); |
|
| 73 | + } else { |
|
| 74 | + $fonc = ''; |
|
| 75 | + } |
|
| 76 | + |
|
| 77 | + if (!$fonc) { // squelette inconnu (==='') ou faux (===false) |
|
| 78 | + $page = $fonc; |
|
| 79 | + } else { |
|
| 80 | + // Preparer l'appel de la fonction principale du squelette |
|
| 81 | + |
|
| 82 | + spip_timer($a = 'calcul page ' . random_int(0, 1000)); |
|
| 83 | + |
|
| 84 | + // On cree un marqueur de notes unique lie a cette composition |
|
| 85 | + // et on enregistre l'etat courant des globales de notes... |
|
| 86 | + if (is_null($notes)) { |
|
| 87 | + $notes = charger_fonction('notes', 'inc', true); |
|
| 88 | + } |
|
| 89 | + if ($notes) { |
|
| 90 | + $notes('', 'empiler'); |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + // Rajouter d'office ces deux parametres |
|
| 94 | + // (mais vaudrait mieux que le compilateur sache le simuler |
|
| 95 | + // car ca interdit l'usage de criteres conditionnels dessus). |
|
| 96 | + if (!isset($contexte['date'])) { |
|
| 97 | + $contexte['date'] = date('Y-m-d H:i:s'); |
|
| 98 | + $contexte['date_default'] = true; |
|
| 99 | + } else { |
|
| 100 | + $contexte['date'] = normaliser_date($contexte['date'], true); |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + if (!isset($contexte['date_redac'])) { |
|
| 104 | + $contexte['date_redac'] = date('Y-m-d H:i:s'); |
|
| 105 | + $contexte['date_redac_default'] = true; |
|
| 106 | + } else { |
|
| 107 | + $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + // Passer le nom du cache pour produire sa destruction automatique |
|
| 111 | + try { |
|
| 112 | + $page = $fonc(['cache' => $cache], [$contexte]); |
|
| 113 | + } catch (Throwable $e) { |
|
| 114 | + $msg = _T('zbug_erreur_execution_page') . " $sourcefile"; |
|
| 115 | + $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 116 | + $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg); |
|
| 117 | + $corps = "<pre>$msg</pre>"; |
|
| 118 | + $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile); |
|
| 119 | + erreur_squelette($full_msg); |
|
| 120 | + unset($msg, $full_msg, $corps); |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + // Restituer les globales de notes telles qu'elles etaient avant l'appel |
|
| 124 | + // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* |
|
| 125 | + // etre dans son resultat, autrement elles ne seraient pas prises en |
|
| 126 | + // compte a chaque calcul d'un texte contenant un modele, mais seulement |
|
| 127 | + // quand le modele serait calcule, et on aurait des resultats incoherents) |
|
| 128 | + if ($notes) { |
|
| 129 | + $notes('', 'depiler'); |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + // reinjecter en dynamique la pile des notes |
|
| 133 | + // si il y a des inclure dynamiques |
|
| 134 | + // si la pile n'est pas vide |
|
| 135 | + // la generalisation de cette injection permettrait de corriger le point juste au dessus |
|
| 136 | + // en faisant remonter les notes a l'incluant (A tester et valider avant application) |
|
| 137 | + if ($notes) { |
|
| 138 | + $page['notes'] = $notes('', 'sauver_etat'); |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + // spip_log: un joli contexte |
|
| 142 | + $infos = presenter_contexte(array_filter($contexte)); |
|
| 143 | + |
|
| 144 | + $profile = spip_timer($a); |
|
| 145 | + spip_log("calcul ($profile) [$skel] $infos" |
|
| 146 | + . ' (' . strlen($page['texte']) . ' octets)'); |
|
| 147 | + |
|
| 148 | + if (defined('_CALCUL_PROFILER') and intval($profile) > _CALCUL_PROFILER) { |
|
| 149 | + spip_log("calcul ($profile) [$skel] $infos" |
|
| 150 | + . ' (' . strlen($page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI'], 'profiler' . _LOG_AVERTISSEMENT); |
|
| 151 | + } |
|
| 152 | + |
|
| 153 | + if ($debug) { |
|
| 154 | + // si c'est ce que demande le debusqueur, lui passer la main |
|
| 155 | + $t = strlen($page['texte']) ? $page['texte'] : ' '; |
|
| 156 | + $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; |
|
| 157 | + $GLOBALS['debug_objets']['courant'] = $courant; |
|
| 158 | + $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; |
|
| 159 | + if ( |
|
| 160 | + $GLOBALS['debug_objets']['sourcefile'] |
|
| 161 | + and (_request('var_mode_objet') == $fonc) |
|
| 162 | + and (_request('var_mode_affiche') == 'resultat') |
|
| 163 | + ) { |
|
| 164 | + erreur_squelette(); |
|
| 165 | + } |
|
| 166 | + } |
|
| 167 | + // Si #CACHE{} n'etait pas la, le mettre a $delais |
|
| 168 | + if (!isset($page['entetes']['X-Spip-Cache'])) { |
|
| 169 | + // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut |
|
| 170 | + // si aucun #CACHE{} spécifié |
|
| 171 | + // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme |
|
| 172 | + // entre public et prive |
|
| 173 | + if (test_espace_prive() or strncmp($fond, 'modeles/', 8) == 0) { |
|
| 174 | + $page['entetes']['X-Spip-Cache'] = 0; |
|
| 175 | + } else { |
|
| 176 | + $page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000; |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + $page['contexte'] = $contexte; |
|
| 181 | + |
|
| 182 | + // faire remonter le fichier source |
|
| 183 | + static $js_inclus = false; |
|
| 184 | + if (defined('_VAR_INCLURE') and _VAR_INCLURE) { |
|
| 185 | + $page['sourcefile'] = $sourcefile; |
|
| 186 | + $page['texte'] = |
|
| 187 | + "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>' |
|
| 188 | + . ($js_inclus ? '' : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>"); |
|
| 189 | + $js_inclus = true; |
|
| 190 | + } |
|
| 191 | + |
|
| 192 | + // Si un modele contenait #SESSION, on note l'info dans $page |
|
| 193 | + if (isset($GLOBALS['cache_utilise_session'])) { |
|
| 194 | + $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session']; |
|
| 195 | + unset($GLOBALS['cache_utilise_session']); |
|
| 196 | + } |
|
| 197 | + } |
|
| 198 | + |
|
| 199 | + if ($select) { |
|
| 200 | + lang_select(); |
|
| 201 | + } |
|
| 202 | + |
|
| 203 | + return $page; |
|
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | /** |
@@ -209,37 +209,37 @@ discard block |
||
| 209 | 209 | * @return string |
| 210 | 210 | */ |
| 211 | 211 | function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) { |
| 212 | - $infos = []; |
|
| 213 | - $line = 0; |
|
| 214 | - foreach ($contexte as $var => $val) { |
|
| 215 | - $line++; |
|
| 216 | - if ($max_lines and $max_lines < $line) { |
|
| 217 | - $infos[] = '…'; |
|
| 218 | - break; |
|
| 219 | - } |
|
| 220 | - if ($val === null) { |
|
| 221 | - $val = ''; |
|
| 222 | - } elseif (is_array($val)) { |
|
| 223 | - if ($profondeur_max > 0) { |
|
| 224 | - $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')'; |
|
| 225 | - } else { |
|
| 226 | - $val = 'array:' . count($val); |
|
| 227 | - } |
|
| 228 | - } elseif (is_object($val)) { |
|
| 229 | - $val = get_class($val); |
|
| 230 | - } elseif (strlen("$val") > 30) { |
|
| 231 | - $val = substr("$val", 0, 29) . '…'; |
|
| 232 | - if (strstr($val, ' ')) { |
|
| 233 | - $val = "'$val'"; |
|
| 234 | - } |
|
| 235 | - } elseif (strstr($val, ' ')) { |
|
| 236 | - $val = "'$val'"; |
|
| 237 | - } elseif (!strlen($val)) { |
|
| 238 | - $val = "''"; |
|
| 239 | - } |
|
| 240 | - $infos[] = $var . '=' . $val; |
|
| 241 | - } |
|
| 242 | - return join(', ', $infos); |
|
| 212 | + $infos = []; |
|
| 213 | + $line = 0; |
|
| 214 | + foreach ($contexte as $var => $val) { |
|
| 215 | + $line++; |
|
| 216 | + if ($max_lines and $max_lines < $line) { |
|
| 217 | + $infos[] = '…'; |
|
| 218 | + break; |
|
| 219 | + } |
|
| 220 | + if ($val === null) { |
|
| 221 | + $val = ''; |
|
| 222 | + } elseif (is_array($val)) { |
|
| 223 | + if ($profondeur_max > 0) { |
|
| 224 | + $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')'; |
|
| 225 | + } else { |
|
| 226 | + $val = 'array:' . count($val); |
|
| 227 | + } |
|
| 228 | + } elseif (is_object($val)) { |
|
| 229 | + $val = get_class($val); |
|
| 230 | + } elseif (strlen("$val") > 30) { |
|
| 231 | + $val = substr("$val", 0, 29) . '…'; |
|
| 232 | + if (strstr($val, ' ')) { |
|
| 233 | + $val = "'$val'"; |
|
| 234 | + } |
|
| 235 | + } elseif (strstr($val, ' ')) { |
|
| 236 | + $val = "'$val'"; |
|
| 237 | + } elseif (!strlen($val)) { |
|
| 238 | + $val = "''"; |
|
| 239 | + } |
|
| 240 | + $infos[] = $var . '=' . $val; |
|
| 241 | + } |
|
| 242 | + return join(', ', $infos); |
|
| 243 | 243 | } |
| 244 | 244 | |
| 245 | 245 | |
@@ -256,11 +256,11 @@ discard block |
||
| 256 | 256 | * @return array|bool |
| 257 | 257 | */ |
| 258 | 258 | function tester_redirection($fond, $contexte, $connect) { |
| 259 | - static $tester_redirection = null; |
|
| 260 | - if (is_null($tester_redirection)) { |
|
| 261 | - $tester_redirection = charger_fonction('tester_redirection', 'public'); |
|
| 262 | - } |
|
| 263 | - return $tester_redirection($fond, $contexte, $connect); |
|
| 259 | + static $tester_redirection = null; |
|
| 260 | + if (is_null($tester_redirection)) { |
|
| 261 | + $tester_redirection = charger_fonction('tester_redirection', 'public'); |
|
| 262 | + } |
|
| 263 | + return $tester_redirection($fond, $contexte, $connect); |
|
| 264 | 264 | } |
| 265 | 265 | |
| 266 | 266 | |
@@ -276,42 +276,42 @@ discard block |
||
| 276 | 276 | * @return array|bool |
| 277 | 277 | */ |
| 278 | 278 | function public_tester_redirection_dist($fond, $contexte, $connect) { |
| 279 | - if ( |
|
| 280 | - $fond == 'article' |
|
| 281 | - and !empty($contexte['id_article']) |
|
| 282 | - and $id_article = intval($contexte['id_article']) |
|
| 283 | - ) { |
|
| 284 | - include_spip('public/quete'); // pour quete_virtuel et ses dependances |
|
| 285 | - $m = quete_virtuel($id_article, $connect) ?? ''; |
|
| 286 | - if (strlen($m)) { |
|
| 287 | - include_spip('inc/texte'); |
|
| 288 | - // les navigateurs pataugent si l'URL est vide |
|
| 289 | - if ($url = virtuel_redirige($m, true)) { |
|
| 290 | - // passer en url absolue car cette redirection pourra |
|
| 291 | - // etre utilisee dans un contexte d'url qui change |
|
| 292 | - // y compris url arbo |
|
| 293 | - $status = 302; |
|
| 294 | - if (defined('_STATUS_REDIRECTION_VIRTUEL')) { |
|
| 295 | - $status = _STATUS_REDIRECTION_VIRTUEL; |
|
| 296 | - } |
|
| 297 | - if (!preg_match(',^\w+:,', $url)) { |
|
| 298 | - include_spip('inc/filtres_mini'); |
|
| 299 | - $url = url_absolue($url); |
|
| 300 | - } |
|
| 301 | - $url = str_replace('&', '&', $url); |
|
| 302 | - |
|
| 303 | - return [ |
|
| 304 | - 'texte' => '<' |
|
| 305 | - . "?php include_spip('inc/headers');redirige_par_entete('" |
|
| 306 | - . texte_script($url) |
|
| 307 | - . "','',$status);" |
|
| 308 | - . '?' . '>', |
|
| 309 | - 'process_ins' => 'php', |
|
| 310 | - 'status' => $status |
|
| 311 | - ]; |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - return false; |
|
| 279 | + if ( |
|
| 280 | + $fond == 'article' |
|
| 281 | + and !empty($contexte['id_article']) |
|
| 282 | + and $id_article = intval($contexte['id_article']) |
|
| 283 | + ) { |
|
| 284 | + include_spip('public/quete'); // pour quete_virtuel et ses dependances |
|
| 285 | + $m = quete_virtuel($id_article, $connect) ?? ''; |
|
| 286 | + if (strlen($m)) { |
|
| 287 | + include_spip('inc/texte'); |
|
| 288 | + // les navigateurs pataugent si l'URL est vide |
|
| 289 | + if ($url = virtuel_redirige($m, true)) { |
|
| 290 | + // passer en url absolue car cette redirection pourra |
|
| 291 | + // etre utilisee dans un contexte d'url qui change |
|
| 292 | + // y compris url arbo |
|
| 293 | + $status = 302; |
|
| 294 | + if (defined('_STATUS_REDIRECTION_VIRTUEL')) { |
|
| 295 | + $status = _STATUS_REDIRECTION_VIRTUEL; |
|
| 296 | + } |
|
| 297 | + if (!preg_match(',^\w+:,', $url)) { |
|
| 298 | + include_spip('inc/filtres_mini'); |
|
| 299 | + $url = url_absolue($url); |
|
| 300 | + } |
|
| 301 | + $url = str_replace('&', '&', $url); |
|
| 302 | + |
|
| 303 | + return [ |
|
| 304 | + 'texte' => '<' |
|
| 305 | + . "?php include_spip('inc/headers');redirige_par_entete('" |
|
| 306 | + . texte_script($url) |
|
| 307 | + . "','',$status);" |
|
| 308 | + . '?' . '>', |
|
| 309 | + 'process_ins' => 'php', |
|
| 310 | + 'status' => $status |
|
| 311 | + ]; |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + return false; |
|
| 317 | 317 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Queue |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | define('_JQ_SCHEDULED', 1); |
@@ -50,103 +50,103 @@ discard block |
||
| 50 | 50 | * id of job |
| 51 | 51 | */ |
| 52 | 52 | function queue_add_job( |
| 53 | - $function, |
|
| 54 | - $description, |
|
| 55 | - $arguments = [], |
|
| 56 | - $file = '', |
|
| 57 | - $no_duplicate = false, |
|
| 58 | - $time = 0, |
|
| 59 | - $priority = 0 |
|
| 53 | + $function, |
|
| 54 | + $description, |
|
| 55 | + $arguments = [], |
|
| 56 | + $file = '', |
|
| 57 | + $no_duplicate = false, |
|
| 58 | + $time = 0, |
|
| 59 | + $priority = 0 |
|
| 60 | 60 | ) { |
| 61 | - include_spip('base/abstract_sql'); |
|
| 62 | - |
|
| 63 | - // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 64 | - if (defined('_GENIE_SYNDIC_NOW')) { |
|
| 65 | - $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - // serialiser les arguments |
|
| 69 | - $arguments = serialize($arguments); |
|
| 70 | - $md5args = md5($arguments); |
|
| 71 | - |
|
| 72 | - // si pas de date programee, des que possible |
|
| 73 | - $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; |
|
| 74 | - if (!$time) { |
|
| 75 | - $time = time(); |
|
| 76 | - $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 77 | - } |
|
| 78 | - $date = date('Y-m-d H:i:s', $time); |
|
| 79 | - |
|
| 80 | - $set_job = [ |
|
| 81 | - 'fonction' => $function, |
|
| 82 | - 'descriptif' => $description, |
|
| 83 | - 'args' => $arguments, |
|
| 84 | - 'md5args' => $md5args, |
|
| 85 | - 'inclure' => $file, |
|
| 86 | - 'priorite' => max(-10, min(10, intval($priority))), |
|
| 87 | - 'date' => $date, |
|
| 88 | - 'status' => _JQ_SCHEDULED, |
|
| 89 | - ]; |
|
| 90 | - // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 91 | - // avec les memes args et file |
|
| 92 | - if ( |
|
| 93 | - $no_duplicate |
|
| 94 | - and |
|
| 95 | - $id_job = sql_getfetsel( |
|
| 96 | - 'id_job', |
|
| 97 | - 'spip_jobs', |
|
| 98 | - $duplicate_where = |
|
| 99 | - $duplicate_where . 'fonction=' . sql_quote($function) |
|
| 100 | - . (($no_duplicate === 'function_only') ? '' : |
|
| 101 | - ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file)) |
|
| 102 | - ) |
|
| 103 | - ) { |
|
| 104 | - return $id_job; |
|
| 105 | - } |
|
| 106 | - |
|
| 107 | - $id_job = sql_insertq('spip_jobs', $set_job); |
|
| 108 | - // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 109 | - // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 110 | - // doit s'effacer |
|
| 111 | - if ( |
|
| 112 | - $no_duplicate |
|
| 113 | - and |
|
| 114 | - $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where") |
|
| 115 | - ) { |
|
| 116 | - sql_delete('spip_jobs', 'id_job=' . intval($id_job)); |
|
| 117 | - |
|
| 118 | - return $id_prev; |
|
| 119 | - } |
|
| 120 | - |
|
| 121 | - // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 122 | - // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 123 | - |
|
| 124 | - // une option de debug pour verifier que les arguments en base sont bons |
|
| 125 | - // ie cas d'un char non acceptables sur certains type de champs |
|
| 126 | - // qui coupe la valeur |
|
| 127 | - if (defined('_JQ_INSERT_CHECK_ARGS') and $id_job) { |
|
| 128 | - $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); |
|
| 129 | - if ($args !== $arguments) { |
|
| 130 | - spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export( |
|
| 131 | - $arguments, |
|
| 132 | - true |
|
| 133 | - ), 'queue'); |
|
| 134 | - } |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - if ($id_job) { |
|
| 138 | - queue_update_next_job_time($time); |
|
| 139 | - } |
|
| 140 | - // si la mise en file d'attente du job echoue, |
|
| 141 | - // il ne faut pas perdre l'execution de la fonction |
|
| 142 | - // on la lance immediatement, c'est un fallback |
|
| 143 | - // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 144 | - elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) { |
|
| 145 | - $set_job['id_job'] = 0; |
|
| 146 | - queue_start_job($set_job); |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - return $id_job; |
|
| 61 | + include_spip('base/abstract_sql'); |
|
| 62 | + |
|
| 63 | + // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 64 | + if (defined('_GENIE_SYNDIC_NOW')) { |
|
| 65 | + $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + // serialiser les arguments |
|
| 69 | + $arguments = serialize($arguments); |
|
| 70 | + $md5args = md5($arguments); |
|
| 71 | + |
|
| 72 | + // si pas de date programee, des que possible |
|
| 73 | + $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; |
|
| 74 | + if (!$time) { |
|
| 75 | + $time = time(); |
|
| 76 | + $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 77 | + } |
|
| 78 | + $date = date('Y-m-d H:i:s', $time); |
|
| 79 | + |
|
| 80 | + $set_job = [ |
|
| 81 | + 'fonction' => $function, |
|
| 82 | + 'descriptif' => $description, |
|
| 83 | + 'args' => $arguments, |
|
| 84 | + 'md5args' => $md5args, |
|
| 85 | + 'inclure' => $file, |
|
| 86 | + 'priorite' => max(-10, min(10, intval($priority))), |
|
| 87 | + 'date' => $date, |
|
| 88 | + 'status' => _JQ_SCHEDULED, |
|
| 89 | + ]; |
|
| 90 | + // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 91 | + // avec les memes args et file |
|
| 92 | + if ( |
|
| 93 | + $no_duplicate |
|
| 94 | + and |
|
| 95 | + $id_job = sql_getfetsel( |
|
| 96 | + 'id_job', |
|
| 97 | + 'spip_jobs', |
|
| 98 | + $duplicate_where = |
|
| 99 | + $duplicate_where . 'fonction=' . sql_quote($function) |
|
| 100 | + . (($no_duplicate === 'function_only') ? '' : |
|
| 101 | + ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file)) |
|
| 102 | + ) |
|
| 103 | + ) { |
|
| 104 | + return $id_job; |
|
| 105 | + } |
|
| 106 | + |
|
| 107 | + $id_job = sql_insertq('spip_jobs', $set_job); |
|
| 108 | + // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 109 | + // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 110 | + // doit s'effacer |
|
| 111 | + if ( |
|
| 112 | + $no_duplicate |
|
| 113 | + and |
|
| 114 | + $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where") |
|
| 115 | + ) { |
|
| 116 | + sql_delete('spip_jobs', 'id_job=' . intval($id_job)); |
|
| 117 | + |
|
| 118 | + return $id_prev; |
|
| 119 | + } |
|
| 120 | + |
|
| 121 | + // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 122 | + // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 123 | + |
|
| 124 | + // une option de debug pour verifier que les arguments en base sont bons |
|
| 125 | + // ie cas d'un char non acceptables sur certains type de champs |
|
| 126 | + // qui coupe la valeur |
|
| 127 | + if (defined('_JQ_INSERT_CHECK_ARGS') and $id_job) { |
|
| 128 | + $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); |
|
| 129 | + if ($args !== $arguments) { |
|
| 130 | + spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export( |
|
| 131 | + $arguments, |
|
| 132 | + true |
|
| 133 | + ), 'queue'); |
|
| 134 | + } |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + if ($id_job) { |
|
| 138 | + queue_update_next_job_time($time); |
|
| 139 | + } |
|
| 140 | + // si la mise en file d'attente du job echoue, |
|
| 141 | + // il ne faut pas perdre l'execution de la fonction |
|
| 142 | + // on la lance immediatement, c'est un fallback |
|
| 143 | + // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 144 | + elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) { |
|
| 145 | + $set_job['id_job'] = 0; |
|
| 146 | + queue_start_job($set_job); |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + return $id_job; |
|
| 150 | 150 | } |
| 151 | 151 | |
| 152 | 152 | /** |
@@ -155,11 +155,11 @@ discard block |
||
| 155 | 155 | * @return void |
| 156 | 156 | */ |
| 157 | 157 | function queue_purger() { |
| 158 | - include_spip('base/abstract_sql'); |
|
| 159 | - sql_delete('spip_jobs'); |
|
| 160 | - sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')'); |
|
| 161 | - include_spip('inc/genie'); |
|
| 162 | - genie_queue_watch_dist(); |
|
| 158 | + include_spip('base/abstract_sql'); |
|
| 159 | + sql_delete('spip_jobs'); |
|
| 160 | + sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')'); |
|
| 161 | + include_spip('inc/genie'); |
|
| 162 | + genie_queue_watch_dist(); |
|
| 163 | 163 | } |
| 164 | 164 | |
| 165 | 165 | /** |
@@ -170,25 +170,25 @@ discard block |
||
| 170 | 170 | * @return int|bool |
| 171 | 171 | */ |
| 172 | 172 | function queue_remove_job($id_job) { |
| 173 | - include_spip('base/abstract_sql'); |
|
| 174 | - |
|
| 175 | - if ( |
|
| 176 | - $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) |
|
| 177 | - and $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) |
|
| 178 | - ) { |
|
| 179 | - queue_unlink_job($id_job); |
|
| 180 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 181 | - if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 182 | - // relancer avec les nouveaux arguments de temps |
|
| 183 | - include_spip('inc/genie'); |
|
| 184 | - // relancer avec la periode prevue |
|
| 185 | - queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date'])); |
|
| 186 | - } |
|
| 187 | - queue_update_next_job_time(); |
|
| 188 | - return $res; |
|
| 189 | - } |
|
| 190 | - |
|
| 191 | - return false; |
|
| 173 | + include_spip('base/abstract_sql'); |
|
| 174 | + |
|
| 175 | + if ( |
|
| 176 | + $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) |
|
| 177 | + and $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) |
|
| 178 | + ) { |
|
| 179 | + queue_unlink_job($id_job); |
|
| 180 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 181 | + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 182 | + // relancer avec les nouveaux arguments de temps |
|
| 183 | + include_spip('inc/genie'); |
|
| 184 | + // relancer avec la periode prevue |
|
| 185 | + queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date'])); |
|
| 186 | + } |
|
| 187 | + queue_update_next_job_time(); |
|
| 188 | + return $res; |
|
| 189 | + } |
|
| 190 | + |
|
| 191 | + return false; |
|
| 192 | 192 | } |
| 193 | 193 | |
| 194 | 194 | /** |
@@ -201,18 +201,18 @@ discard block |
||
| 201 | 201 | * ou un tableau composé de tableaux simples pour lieur plusieurs objets en une fois |
| 202 | 202 | */ |
| 203 | 203 | function queue_link_job($id_job, $objets) { |
| 204 | - include_spip('base/abstract_sql'); |
|
| 205 | - |
|
| 206 | - if (is_array($objets) and count($objets)) { |
|
| 207 | - if (is_array(reset($objets))) { |
|
| 208 | - foreach ($objets as $k => $o) { |
|
| 209 | - $objets[$k]['id_job'] = $id_job; |
|
| 210 | - } |
|
| 211 | - sql_insertq_multi('spip_jobs_liens', $objets); |
|
| 212 | - } else { |
|
| 213 | - sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets)); |
|
| 214 | - } |
|
| 215 | - } |
|
| 204 | + include_spip('base/abstract_sql'); |
|
| 205 | + |
|
| 206 | + if (is_array($objets) and count($objets)) { |
|
| 207 | + if (is_array(reset($objets))) { |
|
| 208 | + foreach ($objets as $k => $o) { |
|
| 209 | + $objets[$k]['id_job'] = $id_job; |
|
| 210 | + } |
|
| 211 | + sql_insertq_multi('spip_jobs_liens', $objets); |
|
| 212 | + } else { |
|
| 213 | + sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets)); |
|
| 214 | + } |
|
| 215 | + } |
|
| 216 | 216 | } |
| 217 | 217 | |
| 218 | 218 | /** |
@@ -224,7 +224,7 @@ discard block |
||
| 224 | 224 | * resultat du sql_delete |
| 225 | 225 | */ |
| 226 | 226 | function queue_unlink_job($id_job) { |
| 227 | - return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job)); |
|
| 227 | + return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job)); |
|
| 228 | 228 | } |
| 229 | 229 | |
| 230 | 230 | /** |
@@ -237,36 +237,36 @@ discard block |
||
| 237 | 237 | */ |
| 238 | 238 | function queue_start_job($row) { |
| 239 | 239 | |
| 240 | - // deserialiser les arguments |
|
| 241 | - $args = unserialize($row['args']); |
|
| 242 | - if (!is_array($args)) { |
|
| 243 | - spip_log('arguments job errones ' . var_export($row, true), 'queue'); |
|
| 244 | - $args = []; |
|
| 245 | - } |
|
| 246 | - |
|
| 247 | - $fonction = $row['fonction']; |
|
| 248 | - if (strlen($inclure = trim($row['inclure']))) { |
|
| 249 | - if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction |
|
| 250 | - $f = charger_fonction($fonction, rtrim($inclure, '/'), false); |
|
| 251 | - if ($f) { |
|
| 252 | - $fonction = $f; |
|
| 253 | - } |
|
| 254 | - } else { |
|
| 255 | - include_spip($inclure); |
|
| 256 | - } |
|
| 257 | - } |
|
| 258 | - |
|
| 259 | - if (!function_exists($fonction)) { |
|
| 260 | - spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); |
|
| 261 | - |
|
| 262 | - return false; |
|
| 263 | - } |
|
| 264 | - |
|
| 265 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue'); |
|
| 266 | - $res = $fonction(...$args); |
|
| 267 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue'); |
|
| 268 | - |
|
| 269 | - return $res; |
|
| 240 | + // deserialiser les arguments |
|
| 241 | + $args = unserialize($row['args']); |
|
| 242 | + if (!is_array($args)) { |
|
| 243 | + spip_log('arguments job errones ' . var_export($row, true), 'queue'); |
|
| 244 | + $args = []; |
|
| 245 | + } |
|
| 246 | + |
|
| 247 | + $fonction = $row['fonction']; |
|
| 248 | + if (strlen($inclure = trim($row['inclure']))) { |
|
| 249 | + if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction |
|
| 250 | + $f = charger_fonction($fonction, rtrim($inclure, '/'), false); |
|
| 251 | + if ($f) { |
|
| 252 | + $fonction = $f; |
|
| 253 | + } |
|
| 254 | + } else { |
|
| 255 | + include_spip($inclure); |
|
| 256 | + } |
|
| 257 | + } |
|
| 258 | + |
|
| 259 | + if (!function_exists($fonction)) { |
|
| 260 | + spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); |
|
| 261 | + |
|
| 262 | + return false; |
|
| 263 | + } |
|
| 264 | + |
|
| 265 | + spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue'); |
|
| 266 | + $res = $fonction(...$args); |
|
| 267 | + spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue'); |
|
| 268 | + |
|
| 269 | + return $res; |
|
| 270 | 270 | } |
| 271 | 271 | |
| 272 | 272 | /** |
@@ -293,89 +293,89 @@ discard block |
||
| 293 | 293 | * - true : une planification a été faite. |
| 294 | 294 | */ |
| 295 | 295 | function queue_schedule($force_jobs = null) { |
| 296 | - $time = time(); |
|
| 297 | - if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 298 | - spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG); |
|
| 299 | - |
|
| 300 | - return; |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - // rien a faire si le prochain job est encore dans le futur |
|
| 304 | - if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { |
|
| 305 | - spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG); |
|
| 306 | - |
|
| 307 | - return; |
|
| 308 | - } |
|
| 309 | - |
|
| 310 | - include_spip('base/abstract_sql'); |
|
| 311 | - // on ne peut rien faire si pas de connexion SQL |
|
| 312 | - if (!spip_connect()) { |
|
| 313 | - return false; |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { |
|
| 317 | - $max_time = ini_get('max_execution_time') / 2; |
|
| 318 | - // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 319 | - if (!$max_time) { |
|
| 320 | - $max_time = 5; |
|
| 321 | - } |
|
| 322 | - define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. |
|
| 323 | - } |
|
| 324 | - $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 325 | - |
|
| 326 | - spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); |
|
| 327 | - |
|
| 328 | - if (!defined('_JQ_MAX_JOBS_EXECUTE')) { |
|
| 329 | - define('_JQ_MAX_JOBS_EXECUTE', 200); |
|
| 330 | - } |
|
| 331 | - $nbj = 0; |
|
| 332 | - // attraper les jobs |
|
| 333 | - // dont la date est passee (echus en attente), |
|
| 334 | - // par ordre : |
|
| 335 | - // - de priorite |
|
| 336 | - // - de date |
|
| 337 | - // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 338 | - // pour qu'il ne bloque pas les autres jobs en attente |
|
| 339 | - if (is_array($force_jobs) and count($force_jobs)) { |
|
| 340 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs); |
|
| 341 | - } else { |
|
| 342 | - $now = date('Y-m-d H:i:s', $time); |
|
| 343 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now); |
|
| 344 | - } |
|
| 345 | - |
|
| 346 | - register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 347 | - $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 348 | - do { |
|
| 349 | - if ($row = array_shift($res)) { |
|
| 350 | - $nbj++; |
|
| 351 | - // il faut un verrou, a base de sql_delete |
|
| 352 | - if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) { |
|
| 353 | - #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 354 | - // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 355 | - $row['status'] = _JQ_PENDING; |
|
| 356 | - $row['date'] = date('Y-m-d H:i:s', $time); |
|
| 357 | - sql_insertq('spip_jobs', $row); |
|
| 358 | - |
|
| 359 | - // on a la main sur le job : |
|
| 360 | - // l'executer |
|
| 361 | - $result = queue_start_job($row); |
|
| 362 | - |
|
| 363 | - $time = time(); |
|
| 364 | - queue_close_job($row, $time, $result); |
|
| 365 | - } |
|
| 366 | - } |
|
| 367 | - spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG); |
|
| 368 | - } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); |
|
| 369 | - spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG); |
|
| 370 | - |
|
| 371 | - if ($row = array_shift($res)) { |
|
| 372 | - queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 373 | - spip_log('JQ encore !', 'jq' . _LOG_DEBUG); |
|
| 374 | - } else { |
|
| 375 | - queue_update_next_job_time(); |
|
| 376 | - } |
|
| 377 | - |
|
| 378 | - return true; |
|
| 296 | + $time = time(); |
|
| 297 | + if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 298 | + spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG); |
|
| 299 | + |
|
| 300 | + return; |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + // rien a faire si le prochain job est encore dans le futur |
|
| 304 | + if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { |
|
| 305 | + spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG); |
|
| 306 | + |
|
| 307 | + return; |
|
| 308 | + } |
|
| 309 | + |
|
| 310 | + include_spip('base/abstract_sql'); |
|
| 311 | + // on ne peut rien faire si pas de connexion SQL |
|
| 312 | + if (!spip_connect()) { |
|
| 313 | + return false; |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { |
|
| 317 | + $max_time = ini_get('max_execution_time') / 2; |
|
| 318 | + // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 319 | + if (!$max_time) { |
|
| 320 | + $max_time = 5; |
|
| 321 | + } |
|
| 322 | + define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. |
|
| 323 | + } |
|
| 324 | + $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 325 | + |
|
| 326 | + spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); |
|
| 327 | + |
|
| 328 | + if (!defined('_JQ_MAX_JOBS_EXECUTE')) { |
|
| 329 | + define('_JQ_MAX_JOBS_EXECUTE', 200); |
|
| 330 | + } |
|
| 331 | + $nbj = 0; |
|
| 332 | + // attraper les jobs |
|
| 333 | + // dont la date est passee (echus en attente), |
|
| 334 | + // par ordre : |
|
| 335 | + // - de priorite |
|
| 336 | + // - de date |
|
| 337 | + // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 338 | + // pour qu'il ne bloque pas les autres jobs en attente |
|
| 339 | + if (is_array($force_jobs) and count($force_jobs)) { |
|
| 340 | + $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs); |
|
| 341 | + } else { |
|
| 342 | + $now = date('Y-m-d H:i:s', $time); |
|
| 343 | + $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now); |
|
| 344 | + } |
|
| 345 | + |
|
| 346 | + register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 347 | + $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 348 | + do { |
|
| 349 | + if ($row = array_shift($res)) { |
|
| 350 | + $nbj++; |
|
| 351 | + // il faut un verrou, a base de sql_delete |
|
| 352 | + if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) { |
|
| 353 | + #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 354 | + // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 355 | + $row['status'] = _JQ_PENDING; |
|
| 356 | + $row['date'] = date('Y-m-d H:i:s', $time); |
|
| 357 | + sql_insertq('spip_jobs', $row); |
|
| 358 | + |
|
| 359 | + // on a la main sur le job : |
|
| 360 | + // l'executer |
|
| 361 | + $result = queue_start_job($row); |
|
| 362 | + |
|
| 363 | + $time = time(); |
|
| 364 | + queue_close_job($row, $time, $result); |
|
| 365 | + } |
|
| 366 | + } |
|
| 367 | + spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG); |
|
| 368 | + } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); |
|
| 369 | + spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG); |
|
| 370 | + |
|
| 371 | + if ($row = array_shift($res)) { |
|
| 372 | + queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 373 | + spip_log('JQ encore !', 'jq' . _LOG_DEBUG); |
|
| 374 | + } else { |
|
| 375 | + queue_update_next_job_time(); |
|
| 376 | + } |
|
| 377 | + |
|
| 378 | + return true; |
|
| 379 | 379 | } |
| 380 | 380 | |
| 381 | 381 | /** |
@@ -393,21 +393,21 @@ discard block |
||
| 393 | 393 | * @param int $result |
| 394 | 394 | */ |
| 395 | 395 | function queue_close_job(&$row, $time, $result = 0) { |
| 396 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 397 | - if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 398 | - // relancer avec les nouveaux arguments de temps |
|
| 399 | - include_spip('inc/genie'); |
|
| 400 | - if ($result < 0) { // relancer tout de suite, mais en baissant la priorite |
|
| 401 | - queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1); |
|
| 402 | - } else // relancer avec la periode prevue |
|
| 403 | - { |
|
| 404 | - queue_genie_replan_job($row['fonction'], $periode, $time); |
|
| 405 | - } |
|
| 406 | - } |
|
| 407 | - // purger ses liens eventuels avec des objets |
|
| 408 | - sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job'])); |
|
| 409 | - // supprimer le job fini |
|
| 410 | - sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); |
|
| 396 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 397 | + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 398 | + // relancer avec les nouveaux arguments de temps |
|
| 399 | + include_spip('inc/genie'); |
|
| 400 | + if ($result < 0) { // relancer tout de suite, mais en baissant la priorite |
|
| 401 | + queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1); |
|
| 402 | + } else // relancer avec la periode prevue |
|
| 403 | + { |
|
| 404 | + queue_genie_replan_job($row['fonction'], $periode, $time); |
|
| 405 | + } |
|
| 406 | + } |
|
| 407 | + // purger ses liens eventuels avec des objets |
|
| 408 | + sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job'])); |
|
| 409 | + // supprimer le job fini |
|
| 410 | + sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); |
|
| 411 | 411 | } |
| 412 | 412 | |
| 413 | 413 | /** |
@@ -417,10 +417,10 @@ discard block |
||
| 417 | 417 | * @uses queue_update_next_job_time() |
| 418 | 418 | */ |
| 419 | 419 | function queue_error_handler() { |
| 420 | - // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 421 | - chdir(_ROOT_CWD); |
|
| 420 | + // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 421 | + chdir(_ROOT_CWD); |
|
| 422 | 422 | |
| 423 | - queue_update_next_job_time(); |
|
| 423 | + queue_update_next_job_time(); |
|
| 424 | 424 | } |
| 425 | 425 | |
| 426 | 426 | |
@@ -437,18 +437,18 @@ discard block |
||
| 437 | 437 | * Périodicité de la tâche en secondes, si tâche périodique, sinon false. |
| 438 | 438 | */ |
| 439 | 439 | function queue_is_cron_job($function, $inclure) { |
| 440 | - static $taches = null; |
|
| 441 | - if (strncmp($inclure, 'genie/', 6) == 0) { |
|
| 442 | - if (is_null($taches)) { |
|
| 443 | - include_spip('inc/genie'); |
|
| 444 | - $taches = taches_generales(); |
|
| 445 | - } |
|
| 446 | - if (isset($taches[$function])) { |
|
| 447 | - return $taches[$function]; |
|
| 448 | - } |
|
| 449 | - } |
|
| 450 | - |
|
| 451 | - return false; |
|
| 440 | + static $taches = null; |
|
| 441 | + if (strncmp($inclure, 'genie/', 6) == 0) { |
|
| 442 | + if (is_null($taches)) { |
|
| 443 | + include_spip('inc/genie'); |
|
| 444 | + $taches = taches_generales(); |
|
| 445 | + } |
|
| 446 | + if (isset($taches[$function])) { |
|
| 447 | + return $taches[$function]; |
|
| 448 | + } |
|
| 449 | + } |
|
| 450 | + |
|
| 451 | + return false; |
|
| 452 | 452 | } |
| 453 | 453 | |
| 454 | 454 | /** |
@@ -462,62 +462,62 @@ discard block |
||
| 462 | 462 | * temps de la tache ajoutee ou 0 pour ASAP |
| 463 | 463 | */ |
| 464 | 464 | function queue_update_next_job_time($next_time = null) { |
| 465 | - static $nb_jobs_scheduled = null; |
|
| 466 | - static $deja_la = false; |
|
| 467 | - // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 468 | - static $next = null; |
|
| 469 | - // queue_close_job peut etre reentrant ici |
|
| 470 | - if ($deja_la) { |
|
| 471 | - return; |
|
| 472 | - } |
|
| 473 | - $deja_la = true; |
|
| 474 | - |
|
| 475 | - include_spip('base/abstract_sql'); |
|
| 476 | - $time = time(); |
|
| 477 | - |
|
| 478 | - // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 479 | - // pour cause de timeout ou autre erreur fatale |
|
| 480 | - $res = sql_allfetsel( |
|
| 481 | - '*', |
|
| 482 | - 'spip_jobs', |
|
| 483 | - 'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 484 | - ); |
|
| 485 | - if (is_array($res)) { |
|
| 486 | - foreach ($res as $row) { |
|
| 487 | - queue_close_job($row, $time); |
|
| 488 | - spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, 1), 'job_mort' . _LOG_ERREUR); |
|
| 489 | - } |
|
| 490 | - } |
|
| 491 | - |
|
| 492 | - // chercher la date du prochain job si pas connu |
|
| 493 | - if (is_null($next) or is_null(queue_sleep_time_to_next_job())) { |
|
| 494 | - $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 495 | - $next = strtotime($date); |
|
| 496 | - } |
|
| 497 | - if (!is_null($next_time)) { |
|
| 498 | - if (is_null($next) or $next > $next_time) { |
|
| 499 | - $next = $next_time; |
|
| 500 | - } |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - if ($next) { |
|
| 504 | - if (is_null($nb_jobs_scheduled)) { |
|
| 505 | - $nb_jobs_scheduled = sql_countsel( |
|
| 506 | - 'spip_jobs', |
|
| 507 | - 'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 508 | - ); |
|
| 509 | - } elseif ($next <= $time) { |
|
| 510 | - $nb_jobs_scheduled++; |
|
| 511 | - } |
|
| 512 | - // si trop de jobs en attente, on force la purge en fin de hit |
|
| 513 | - // pour assurer le coup |
|
| 514 | - if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) { |
|
| 515 | - define('_DIRECT_CRON_FORCE', true); |
|
| 516 | - } |
|
| 517 | - } |
|
| 518 | - |
|
| 519 | - queue_set_next_job_time($next); |
|
| 520 | - $deja_la = false; |
|
| 465 | + static $nb_jobs_scheduled = null; |
|
| 466 | + static $deja_la = false; |
|
| 467 | + // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 468 | + static $next = null; |
|
| 469 | + // queue_close_job peut etre reentrant ici |
|
| 470 | + if ($deja_la) { |
|
| 471 | + return; |
|
| 472 | + } |
|
| 473 | + $deja_la = true; |
|
| 474 | + |
|
| 475 | + include_spip('base/abstract_sql'); |
|
| 476 | + $time = time(); |
|
| 477 | + |
|
| 478 | + // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 479 | + // pour cause de timeout ou autre erreur fatale |
|
| 480 | + $res = sql_allfetsel( |
|
| 481 | + '*', |
|
| 482 | + 'spip_jobs', |
|
| 483 | + 'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 484 | + ); |
|
| 485 | + if (is_array($res)) { |
|
| 486 | + foreach ($res as $row) { |
|
| 487 | + queue_close_job($row, $time); |
|
| 488 | + spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, 1), 'job_mort' . _LOG_ERREUR); |
|
| 489 | + } |
|
| 490 | + } |
|
| 491 | + |
|
| 492 | + // chercher la date du prochain job si pas connu |
|
| 493 | + if (is_null($next) or is_null(queue_sleep_time_to_next_job())) { |
|
| 494 | + $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 495 | + $next = strtotime($date); |
|
| 496 | + } |
|
| 497 | + if (!is_null($next_time)) { |
|
| 498 | + if (is_null($next) or $next > $next_time) { |
|
| 499 | + $next = $next_time; |
|
| 500 | + } |
|
| 501 | + } |
|
| 502 | + |
|
| 503 | + if ($next) { |
|
| 504 | + if (is_null($nb_jobs_scheduled)) { |
|
| 505 | + $nb_jobs_scheduled = sql_countsel( |
|
| 506 | + 'spip_jobs', |
|
| 507 | + 'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 508 | + ); |
|
| 509 | + } elseif ($next <= $time) { |
|
| 510 | + $nb_jobs_scheduled++; |
|
| 511 | + } |
|
| 512 | + // si trop de jobs en attente, on force la purge en fin de hit |
|
| 513 | + // pour assurer le coup |
|
| 514 | + if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) { |
|
| 515 | + define('_DIRECT_CRON_FORCE', true); |
|
| 516 | + } |
|
| 517 | + } |
|
| 518 | + |
|
| 519 | + queue_set_next_job_time($next); |
|
| 520 | + $deja_la = false; |
|
| 521 | 521 | } |
| 522 | 522 | |
| 523 | 523 | |
@@ -528,26 +528,26 @@ discard block |
||
| 528 | 528 | */ |
| 529 | 529 | function queue_set_next_job_time($next) { |
| 530 | 530 | |
| 531 | - // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 532 | - $time = time(); |
|
| 533 | - |
|
| 534 | - // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 535 | - // et ne mettre a jour que si il y a un interet a le faire |
|
| 536 | - // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 537 | - $curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true)); |
|
| 538 | - if ( |
|
| 539 | - ($curr_next <= $time and $next > $time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 540 | - or $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle |
|
| 541 | - ) { |
|
| 542 | - if (function_exists('cache_set') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) { |
|
| 543 | - cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 544 | - } else { |
|
| 545 | - ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 546 | - } |
|
| 547 | - queue_sleep_time_to_next_job($next); |
|
| 548 | - } |
|
| 549 | - |
|
| 550 | - return queue_sleep_time_to_next_job(); |
|
| 531 | + // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 532 | + $time = time(); |
|
| 533 | + |
|
| 534 | + // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 535 | + // et ne mettre a jour que si il y a un interet a le faire |
|
| 536 | + // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 537 | + $curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true)); |
|
| 538 | + if ( |
|
| 539 | + ($curr_next <= $time and $next > $time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 540 | + or $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle |
|
| 541 | + ) { |
|
| 542 | + if (function_exists('cache_set') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) { |
|
| 543 | + cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 544 | + } else { |
|
| 545 | + ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 546 | + } |
|
| 547 | + queue_sleep_time_to_next_job($next); |
|
| 548 | + } |
|
| 549 | + |
|
| 550 | + return queue_sleep_time_to_next_job(); |
|
| 551 | 551 | } |
| 552 | 552 | |
| 553 | 553 | /** |
@@ -564,60 +564,60 @@ discard block |
||
| 564 | 564 | * @return string |
| 565 | 565 | */ |
| 566 | 566 | function queue_affichage_cron() { |
| 567 | - $texte = ''; |
|
| 568 | - |
|
| 569 | - $time_to_next = queue_sleep_time_to_next_job(); |
|
| 570 | - // rien a faire si le prochain job est encore dans le futur |
|
| 571 | - if ($time_to_next > 0 or defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 572 | - return $texte; |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 576 | - if (file_exists($lock = _DIR_TMP . 'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 577 | - return $texte; |
|
| 578 | - } |
|
| 579 | - |
|
| 580 | - @touch($lock); |
|
| 581 | - |
|
| 582 | - // il y a des taches en attentes |
|
| 583 | - // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 584 | - // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 585 | - $urgent = false; |
|
| 586 | - if ($time_to_next < -300) { |
|
| 587 | - $urgent = true; |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - $url_cron = generer_url_action('cron', '', false, true); |
|
| 591 | - |
|
| 592 | - if (!defined('_HTML_BG_CRON_FORCE') or !_HTML_BG_CRON_FORCE) { |
|
| 593 | - if (queue_lancer_url_http_async($url_cron) and !$urgent) { |
|
| 594 | - return $texte; |
|
| 595 | - } |
|
| 596 | - } |
|
| 597 | - |
|
| 598 | - // si deja force, on retourne sans rien |
|
| 599 | - if (defined('_DIRECT_CRON_FORCE')) { |
|
| 600 | - return $texte; |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - // si c'est un bot |
|
| 604 | - // inutile de faire un appel par image background, |
|
| 605 | - // on force un appel direct en fin de hit |
|
| 606 | - if ((defined('_IS_BOT') and _IS_BOT)) { |
|
| 607 | - define('_DIRECT_CRON_FORCE', true); |
|
| 608 | - |
|
| 609 | - return $texte; |
|
| 610 | - } |
|
| 611 | - |
|
| 612 | - if (!defined('_HTML_BG_CRON_INHIB') or !_HTML_BG_CRON_INHIB) { |
|
| 613 | - // en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS |
|
| 614 | - $url_cron = generer_url_action('cron'); |
|
| 615 | - $texte = '<!-- SPIP-CRON -->' |
|
| 616 | - . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>" |
|
| 617 | - . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>"; |
|
| 618 | - } |
|
| 619 | - |
|
| 620 | - return $texte; |
|
| 567 | + $texte = ''; |
|
| 568 | + |
|
| 569 | + $time_to_next = queue_sleep_time_to_next_job(); |
|
| 570 | + // rien a faire si le prochain job est encore dans le futur |
|
| 571 | + if ($time_to_next > 0 or defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 572 | + return $texte; |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 576 | + if (file_exists($lock = _DIR_TMP . 'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 577 | + return $texte; |
|
| 578 | + } |
|
| 579 | + |
|
| 580 | + @touch($lock); |
|
| 581 | + |
|
| 582 | + // il y a des taches en attentes |
|
| 583 | + // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 584 | + // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 585 | + $urgent = false; |
|
| 586 | + if ($time_to_next < -300) { |
|
| 587 | + $urgent = true; |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + $url_cron = generer_url_action('cron', '', false, true); |
|
| 591 | + |
|
| 592 | + if (!defined('_HTML_BG_CRON_FORCE') or !_HTML_BG_CRON_FORCE) { |
|
| 593 | + if (queue_lancer_url_http_async($url_cron) and !$urgent) { |
|
| 594 | + return $texte; |
|
| 595 | + } |
|
| 596 | + } |
|
| 597 | + |
|
| 598 | + // si deja force, on retourne sans rien |
|
| 599 | + if (defined('_DIRECT_CRON_FORCE')) { |
|
| 600 | + return $texte; |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + // si c'est un bot |
|
| 604 | + // inutile de faire un appel par image background, |
|
| 605 | + // on force un appel direct en fin de hit |
|
| 606 | + if ((defined('_IS_BOT') and _IS_BOT)) { |
|
| 607 | + define('_DIRECT_CRON_FORCE', true); |
|
| 608 | + |
|
| 609 | + return $texte; |
|
| 610 | + } |
|
| 611 | + |
|
| 612 | + if (!defined('_HTML_BG_CRON_INHIB') or !_HTML_BG_CRON_INHIB) { |
|
| 613 | + // en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS |
|
| 614 | + $url_cron = generer_url_action('cron'); |
|
| 615 | + $texte = '<!-- SPIP-CRON -->' |
|
| 616 | + . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>" |
|
| 617 | + . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>"; |
|
| 618 | + } |
|
| 619 | + |
|
| 620 | + return $texte; |
|
| 621 | 621 | } |
| 622 | 622 | |
| 623 | 623 | /** |
@@ -626,73 +626,73 @@ discard block |
||
| 626 | 626 | * @return bool : true si l'url a pu être appelée en asynchrone, false sinon |
| 627 | 627 | */ |
| 628 | 628 | function queue_lancer_url_http_async($url_cron) { |
| 629 | - // methode la plus rapide : |
|
| 630 | - // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 631 | - // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 632 | - // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 633 | - // mais on renvoie false direct |
|
| 634 | - if (function_exists('fsockopen')) { |
|
| 635 | - $parts = parse_url($url_cron); |
|
| 636 | - |
|
| 637 | - switch ($parts['scheme']) { |
|
| 638 | - case 'https': |
|
| 639 | - $scheme = 'ssl://'; |
|
| 640 | - $port = 443; |
|
| 641 | - break; |
|
| 642 | - case 'http': |
|
| 643 | - default: |
|
| 644 | - $scheme = ''; |
|
| 645 | - $port = 80; |
|
| 646 | - } |
|
| 647 | - $fp = @fsockopen( |
|
| 648 | - $scheme . $parts['host'], |
|
| 649 | - $parts['port'] ?? $port, |
|
| 650 | - $errno, |
|
| 651 | - $errstr, |
|
| 652 | - 1 |
|
| 653 | - ); |
|
| 654 | - |
|
| 655 | - if ($fp) { |
|
| 656 | - $host_sent = $parts['host']; |
|
| 657 | - if (isset($parts['port']) and $parts['port'] !== $port) { |
|
| 658 | - $host_sent .= ':' . $parts['port']; |
|
| 659 | - } |
|
| 660 | - $timeout = 200; // ms |
|
| 661 | - stream_set_timeout($fp, 0, $timeout * 1000); |
|
| 662 | - $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : ''); |
|
| 663 | - $out = 'GET ' . $query . " HTTP/1.1\r\n"; |
|
| 664 | - $out .= 'Host: ' . $host_sent . "\r\n"; |
|
| 665 | - $out .= "Connection: Close\r\n\r\n"; |
|
| 666 | - fwrite($fp, $out); |
|
| 667 | - spip_timer('read'); |
|
| 668 | - $t = 0; |
|
| 669 | - // on lit la reponse si possible pour fermer proprement la connexion |
|
| 670 | - // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 671 | - while (!feof($fp) and $t < $timeout) { |
|
| 672 | - @fgets($fp, 1024); |
|
| 673 | - $t += spip_timer('read', true); |
|
| 674 | - spip_timer('read'); |
|
| 675 | - } |
|
| 676 | - fclose($fp); |
|
| 677 | - return true; |
|
| 678 | - } |
|
| 679 | - } |
|
| 680 | - // si fsockopen n'est pas dispo on essaye cURL : |
|
| 681 | - // lancer le cron par un cURL asynchrone si cURL est present |
|
| 682 | - elseif (function_exists('curl_init')) { |
|
| 683 | - //setting the curl parameters. |
|
| 684 | - $ch = curl_init($url_cron); |
|
| 685 | - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 686 | - // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 687 | - curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 688 | - // valeur mini pour que la requete soit lancee |
|
| 689 | - curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 690 | - // lancer |
|
| 691 | - curl_exec($ch); |
|
| 692 | - // fermer |
|
| 693 | - curl_close($ch); |
|
| 694 | - return true; |
|
| 695 | - } |
|
| 696 | - |
|
| 697 | - return false; |
|
| 629 | + // methode la plus rapide : |
|
| 630 | + // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 631 | + // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 632 | + // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 633 | + // mais on renvoie false direct |
|
| 634 | + if (function_exists('fsockopen')) { |
|
| 635 | + $parts = parse_url($url_cron); |
|
| 636 | + |
|
| 637 | + switch ($parts['scheme']) { |
|
| 638 | + case 'https': |
|
| 639 | + $scheme = 'ssl://'; |
|
| 640 | + $port = 443; |
|
| 641 | + break; |
|
| 642 | + case 'http': |
|
| 643 | + default: |
|
| 644 | + $scheme = ''; |
|
| 645 | + $port = 80; |
|
| 646 | + } |
|
| 647 | + $fp = @fsockopen( |
|
| 648 | + $scheme . $parts['host'], |
|
| 649 | + $parts['port'] ?? $port, |
|
| 650 | + $errno, |
|
| 651 | + $errstr, |
|
| 652 | + 1 |
|
| 653 | + ); |
|
| 654 | + |
|
| 655 | + if ($fp) { |
|
| 656 | + $host_sent = $parts['host']; |
|
| 657 | + if (isset($parts['port']) and $parts['port'] !== $port) { |
|
| 658 | + $host_sent .= ':' . $parts['port']; |
|
| 659 | + } |
|
| 660 | + $timeout = 200; // ms |
|
| 661 | + stream_set_timeout($fp, 0, $timeout * 1000); |
|
| 662 | + $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : ''); |
|
| 663 | + $out = 'GET ' . $query . " HTTP/1.1\r\n"; |
|
| 664 | + $out .= 'Host: ' . $host_sent . "\r\n"; |
|
| 665 | + $out .= "Connection: Close\r\n\r\n"; |
|
| 666 | + fwrite($fp, $out); |
|
| 667 | + spip_timer('read'); |
|
| 668 | + $t = 0; |
|
| 669 | + // on lit la reponse si possible pour fermer proprement la connexion |
|
| 670 | + // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 671 | + while (!feof($fp) and $t < $timeout) { |
|
| 672 | + @fgets($fp, 1024); |
|
| 673 | + $t += spip_timer('read', true); |
|
| 674 | + spip_timer('read'); |
|
| 675 | + } |
|
| 676 | + fclose($fp); |
|
| 677 | + return true; |
|
| 678 | + } |
|
| 679 | + } |
|
| 680 | + // si fsockopen n'est pas dispo on essaye cURL : |
|
| 681 | + // lancer le cron par un cURL asynchrone si cURL est present |
|
| 682 | + elseif (function_exists('curl_init')) { |
|
| 683 | + //setting the curl parameters. |
|
| 684 | + $ch = curl_init($url_cron); |
|
| 685 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 686 | + // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 687 | + curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 688 | + // valeur mini pour que la requete soit lancee |
|
| 689 | + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 690 | + // lancer |
|
| 691 | + curl_exec($ch); |
|
| 692 | + // fermer |
|
| 693 | + curl_close($ch); |
|
| 694 | + return true; |
|
| 695 | + } |
|
| 696 | + |
|
| 697 | + return false; |
|
| 698 | 698 | } |
@@ -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 | /** |
@@ -32,11 +32,11 @@ discard block |
||
| 32 | 32 | * @return void |
| 33 | 33 | **/ |
| 34 | 34 | function array_set_merge(&$table, $index, $valeur) { |
| 35 | - if (!isset($table[$index])) { |
|
| 36 | - $table[$index] = $valeur; |
|
| 37 | - } else { |
|
| 38 | - $table[$index] = array_merge($table[$index], $valeur); |
|
| 39 | - } |
|
| 35 | + if (!isset($table[$index])) { |
|
| 36 | + $table[$index] = $valeur; |
|
| 37 | + } else { |
|
| 38 | + $table[$index] = array_merge($table[$index], $valeur); |
|
| 39 | + } |
|
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | /** |
@@ -55,441 +55,441 @@ discard block |
||
| 55 | 55 | * - string (interne) si table '::md5' retourne un hash |
| 56 | 56 | */ |
| 57 | 57 | function lister_tables_objets_sql(?string $table_sql = null, $desc = []) { |
| 58 | - static $deja_la = false; |
|
| 59 | - static $infos_tables = null; |
|
| 60 | - static $md5 = null; |
|
| 61 | - static $plugin_hash = null; |
|
| 62 | - |
|
| 63 | - // plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé. |
|
| 64 | - $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT'; |
|
| 65 | - |
|
| 66 | - // prealablement recuperer les tables_principales |
|
| 67 | - if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) { |
|
| 68 | - // pas de reentrance (cas base/serial) |
|
| 69 | - if ($deja_la) { |
|
| 70 | - spip_log('Re-entrance anormale sur lister_tables_objets_sql : ' |
|
| 71 | - . var_export(debug_backtrace(), true), _LOG_CRITIQUE); |
|
| 72 | - |
|
| 73 | - return ($table_sql === '::md5' ? $md5 : []); |
|
| 74 | - } |
|
| 75 | - $deja_la = true; |
|
| 76 | - $plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines |
|
| 77 | - |
|
| 78 | - // recuperer les declarations explicites ancienne mode |
|
| 79 | - // qui servent a completer declarer_tables_objets_sql |
|
| 80 | - base_serial($GLOBALS['tables_principales']); |
|
| 81 | - base_auxiliaires($GLOBALS['tables_auxiliaires']); |
|
| 82 | - $infos_tables = [ |
|
| 83 | - 'spip_articles' => [ |
|
| 84 | - 'page' => 'article', |
|
| 85 | - 'texte_retour' => 'icone_retour_article', |
|
| 86 | - 'texte_modifier' => 'icone_modifier_article', |
|
| 87 | - 'texte_creer' => 'icone_ecrire_article', |
|
| 88 | - 'texte_objets' => 'public:articles', |
|
| 89 | - 'texte_objet' => 'public:article', |
|
| 90 | - 'texte_signale_edition' => 'texte_travail_article', |
|
| 91 | - 'info_aucun_objet' => 'info_aucun_article', |
|
| 92 | - 'info_1_objet' => 'info_1_article', |
|
| 93 | - 'info_nb_objets' => 'info_nb_articles', |
|
| 94 | - 'texte_logo_objet' => 'logo_article', |
|
| 95 | - 'texte_langue_objet' => 'titre_langue_article', |
|
| 96 | - 'texte_definir_comme_traduction_objet' => 'trad_lier', |
|
| 97 | - 'titre' => 'titre, lang', |
|
| 98 | - 'date' => 'date', |
|
| 99 | - 'principale' => 'oui', |
|
| 100 | - 'introduction_longueur' => '500', |
|
| 101 | - 'champs_editables' => [ |
|
| 102 | - 'surtitre', |
|
| 103 | - 'titre', |
|
| 104 | - 'soustitre', |
|
| 105 | - 'descriptif', |
|
| 106 | - 'nom_site', |
|
| 107 | - 'url_site', |
|
| 108 | - 'chapo', |
|
| 109 | - 'texte', |
|
| 110 | - 'ps', |
|
| 111 | - 'virtuel' |
|
| 112 | - ], |
|
| 113 | - 'champs_versionnes' => [ |
|
| 114 | - 'id_rubrique', |
|
| 115 | - 'surtitre', |
|
| 116 | - 'titre', |
|
| 117 | - 'soustitre', |
|
| 118 | - 'jointure_auteurs', |
|
| 119 | - 'descriptif', |
|
| 120 | - 'nom_site', |
|
| 121 | - 'url_site', |
|
| 122 | - 'chapo', |
|
| 123 | - 'texte', |
|
| 124 | - 'ps' |
|
| 125 | - ], |
|
| 126 | - 'field' => [ |
|
| 127 | - 'id_article' => 'bigint(21) NOT NULL', |
|
| 128 | - 'surtitre' => "text DEFAULT '' NOT NULL", |
|
| 129 | - 'titre' => "text DEFAULT '' NOT NULL", |
|
| 130 | - 'soustitre' => "text DEFAULT '' NOT NULL", |
|
| 131 | - 'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 132 | - 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 133 | - 'chapo' => "mediumtext DEFAULT '' NOT NULL", |
|
| 134 | - 'texte' => "longtext DEFAULT '' NOT NULL", |
|
| 135 | - 'ps' => "mediumtext DEFAULT '' NOT NULL", |
|
| 136 | - 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 137 | - 'statut' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 138 | - 'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 139 | - 'maj' => 'TIMESTAMP', |
|
| 140 | - 'export' => "VARCHAR(10) DEFAULT 'oui'", |
|
| 141 | - 'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 142 | - 'visites' => "integer DEFAULT '0' NOT NULL", |
|
| 143 | - 'referers' => "integer DEFAULT '0' NOT NULL", |
|
| 144 | - 'popularite' => "DOUBLE DEFAULT '0' NOT NULL", |
|
| 145 | - 'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL", |
|
| 146 | - 'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 147 | - 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 148 | - 'langue_choisie' => "VARCHAR(3) DEFAULT 'non'", |
|
| 149 | - 'id_trad' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 150 | - 'nom_site' => "tinytext DEFAULT '' NOT NULL", |
|
| 151 | - 'url_site' => "text DEFAULT '' NOT NULL", |
|
| 152 | - 'virtuel' => "text DEFAULT '' NOT NULL", |
|
| 153 | - ], |
|
| 154 | - 'key' => [ |
|
| 155 | - 'PRIMARY KEY' => 'id_article', |
|
| 156 | - 'KEY id_rubrique' => 'id_rubrique', |
|
| 157 | - 'KEY id_secteur' => 'id_secteur', |
|
| 158 | - 'KEY id_trad' => 'id_trad', |
|
| 159 | - 'KEY lang' => 'lang', |
|
| 160 | - 'KEY statut' => 'statut, date', |
|
| 161 | - ], |
|
| 162 | - 'join' => [ |
|
| 163 | - 'id_article' => 'id_article', |
|
| 164 | - 'id_rubrique' => 'id_rubrique' |
|
| 165 | - ], |
|
| 166 | - 'parent' => [ |
|
| 167 | - ['type' => 'rubrique', 'champ' => 'id_rubrique'] |
|
| 168 | - ], |
|
| 169 | - 'rechercher_champs' => [ |
|
| 170 | - 'surtitre' => 5, |
|
| 171 | - 'titre' => 8, |
|
| 172 | - 'soustitre' => 5, |
|
| 173 | - 'chapo' => 3, |
|
| 174 | - 'texte' => 1, |
|
| 175 | - 'ps' => 1, |
|
| 176 | - 'nom_site' => 1, |
|
| 177 | - 'url_site' => 1, |
|
| 178 | - 'descriptif' => 4 |
|
| 179 | - ], |
|
| 180 | - 'rechercher_jointures' => [ |
|
| 181 | - 'auteur' => ['nom' => 10], |
|
| 182 | - ], |
|
| 183 | - 'statut' => [ |
|
| 184 | - [ |
|
| 185 | - 'champ' => 'statut', |
|
| 186 | - 'publie' => 'publie', |
|
| 187 | - 'previsu' => 'publie,prop,prepa/auteur', |
|
| 188 | - 'post_date' => 'date', |
|
| 189 | - 'exception' => ['statut', 'tout'] |
|
| 190 | - ] |
|
| 191 | - ], |
|
| 192 | - 'statut_titres' => [ |
|
| 193 | - 'prepa' => 'info_article_redaction', |
|
| 194 | - 'prop' => 'info_article_propose', |
|
| 195 | - 'publie' => 'info_article_publie', |
|
| 196 | - 'refuse' => 'info_article_refuse', |
|
| 197 | - 'poubelle' => 'info_article_supprime' |
|
| 198 | - ], |
|
| 199 | - 'statut_textes_instituer' => [ |
|
| 200 | - 'prepa' => 'texte_statut_en_cours_redaction', |
|
| 201 | - 'prop' => 'texte_statut_propose_evaluation', |
|
| 202 | - 'publie' => 'texte_statut_publie', |
|
| 203 | - 'refuse' => 'texte_statut_refuse', |
|
| 204 | - 'poubelle' => 'texte_statut_poubelle', |
|
| 205 | - ], |
|
| 206 | - 'texte_changer_statut' => 'texte_article_statut', |
|
| 207 | - 'aide_changer_statut' => 'artstatut', |
|
| 208 | - 'tables_jointures' => [ |
|
| 209 | - 'profondeur' => 'rubriques', |
|
| 210 | - #'id_auteur' => 'auteurs_liens' // declaration generique plus bas |
|
| 211 | - ], |
|
| 212 | - ], |
|
| 213 | - 'spip_auteurs' => [ |
|
| 214 | - 'page' => 'auteur', |
|
| 215 | - 'texte_retour' => 'icone_retour', |
|
| 216 | - 'texte_ajouter' => 'titre_ajouter_un_auteur', |
|
| 217 | - 'texte_modifier' => 'admin_modifier_auteur', |
|
| 218 | - 'texte_objets' => 'icone_auteurs', |
|
| 219 | - 'texte_objet' => 'public:auteur', |
|
| 220 | - 'info_aucun_objet' => 'info_aucun_auteur', |
|
| 221 | - 'info_1_objet' => 'info_1_auteur', |
|
| 222 | - 'info_nb_objets' => 'info_nb_auteurs', |
|
| 223 | - 'texte_logo_objet' => 'logo_auteur', |
|
| 224 | - 'texte_creer_associer' => 'creer_et_associer_un_auteur', |
|
| 225 | - 'titre' => "nom AS titre, '' AS lang", |
|
| 226 | - 'date' => 'date', |
|
| 227 | - 'principale' => 'oui', |
|
| 228 | - 'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'], |
|
| 229 | - 'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'], |
|
| 230 | - 'field' => [ |
|
| 231 | - 'id_auteur' => 'bigint(21) NOT NULL', |
|
| 232 | - 'nom' => "text DEFAULT '' NOT NULL", |
|
| 233 | - 'bio' => "text DEFAULT '' NOT NULL", |
|
| 234 | - 'email' => "tinytext DEFAULT '' NOT NULL", |
|
| 235 | - 'nom_site' => "tinytext DEFAULT '' NOT NULL", |
|
| 236 | - 'url_site' => "text DEFAULT '' NOT NULL", |
|
| 237 | - 'login' => 'VARCHAR(255) BINARY', |
|
| 238 | - 'pass' => "tinytext DEFAULT '' NOT NULL", |
|
| 239 | - 'low_sec' => "tinytext DEFAULT '' NOT NULL", |
|
| 240 | - 'statut' => "varchar(255) DEFAULT '0' NOT NULL", |
|
| 241 | - 'webmestre' => "varchar(3) DEFAULT 'non' NOT NULL", |
|
| 242 | - 'maj' => 'TIMESTAMP', |
|
| 243 | - 'pgp' => "TEXT DEFAULT '' NOT NULL", |
|
| 244 | - 'htpass' => "tinytext DEFAULT '' NOT NULL", |
|
| 245 | - 'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 246 | - 'alea_actuel' => 'tinytext', |
|
| 247 | - 'alea_futur' => 'tinytext', |
|
| 248 | - 'prefs' => 'text', |
|
| 249 | - 'cookie_oubli' => 'tinytext', |
|
| 250 | - 'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL", |
|
| 251 | - 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 252 | - 'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL", |
|
| 253 | - 'backup_cles' => "mediumtext DEFAULT '' NOT NULL", |
|
| 254 | - ], |
|
| 255 | - 'key' => [ |
|
| 256 | - 'PRIMARY KEY' => 'id_auteur', |
|
| 257 | - 'KEY login' => 'login', |
|
| 258 | - 'KEY statut' => 'statut', |
|
| 259 | - 'KEY en_ligne' => 'en_ligne', |
|
| 260 | - ], |
|
| 261 | - 'join' => [ |
|
| 262 | - 'id_auteur' => 'id_auteur', |
|
| 263 | - 'login' => 'login' |
|
| 264 | - ], |
|
| 265 | - 'rechercher_champs' => [ |
|
| 266 | - 'nom' => 5, |
|
| 267 | - 'bio' => 1, |
|
| 268 | - 'email' => 1, |
|
| 269 | - 'nom_site' => 1, |
|
| 270 | - 'url_site' => 1, |
|
| 271 | - 'login' => 1 |
|
| 272 | - ], |
|
| 273 | - // 2 conditions pour les auteurs : statut!=poubelle, |
|
| 274 | - // et avoir des articles publies |
|
| 275 | - 'statut' => [ |
|
| 276 | - [ |
|
| 277 | - 'champ' => 'statut', |
|
| 278 | - 'publie' => '!5poubelle', |
|
| 279 | - 'previsu' => '!5poubelle', |
|
| 280 | - 'exception' => 'statut' |
|
| 281 | - ], |
|
| 282 | - [ |
|
| 283 | - 'champ' => [ |
|
| 284 | - ['spip_auteurs_liens', 'id_auteur'], |
|
| 285 | - [ |
|
| 286 | - 'spip_articles', |
|
| 287 | - ['id_objet', 'id_article', 'objet', 'article'] |
|
| 288 | - ], |
|
| 289 | - 'statut' |
|
| 290 | - ], |
|
| 291 | - 'publie' => 'publie', |
|
| 292 | - 'previsu' => '!', |
|
| 293 | - 'post_date' => 'date', |
|
| 294 | - 'exception' => ['statut', 'lien', 'tout'] |
|
| 295 | - ], |
|
| 296 | - ], |
|
| 297 | - 'statut_images' => [ |
|
| 298 | - 'auteur-6forum-16.png', |
|
| 299 | - '0minirezo' => 'auteur-0minirezo-16.png', |
|
| 300 | - '1comite' => 'auteur-1comite-16.png', |
|
| 301 | - '6forum' => 'auteur-6forum-16.png', |
|
| 302 | - '5poubelle' => 'auteur-5poubelle-16.png', |
|
| 303 | - 'nouveau' => '' |
|
| 304 | - ], |
|
| 305 | - 'statut_titres' => [ |
|
| 306 | - 'titre_image_visiteur', |
|
| 307 | - '0minirezo' => 'titre_image_administrateur', |
|
| 308 | - '1comite' => 'titre_image_redacteur_02', |
|
| 309 | - '6forum' => 'titre_image_visiteur', |
|
| 310 | - '5poubelle' => 'titre_image_auteur_supprime', |
|
| 311 | - ], |
|
| 312 | - 'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas |
|
| 313 | - ], |
|
| 314 | - ], |
|
| 315 | - 'spip_rubriques' => [ |
|
| 316 | - 'page' => 'rubrique', |
|
| 317 | - 'url_voir' => 'rubrique', |
|
| 318 | - 'url_edit' => 'rubrique_edit', |
|
| 319 | - 'texte_retour' => 'icone_retour', |
|
| 320 | - 'texte_objets' => 'public:rubriques', |
|
| 321 | - 'texte_objet' => 'public:rubrique', |
|
| 322 | - 'texte_modifier' => 'icone_modifier_rubrique', |
|
| 323 | - 'texte_creer' => 'icone_creer_rubrique', |
|
| 324 | - 'texte_ajouter' => 'titre_ajouter_une_rubrique', |
|
| 325 | - 'texte_creer_associer' => 'creer_et_associer_une_rubrique', |
|
| 326 | - 'info_aucun_objet' => 'info_aucun_rubrique', |
|
| 327 | - 'info_1_objet' => 'info_1_rubrique', |
|
| 328 | - 'info_nb_objets' => 'info_nb_rubriques', |
|
| 329 | - 'texte_logo_objet' => 'logo_rubrique', |
|
| 330 | - 'texte_langue_objet' => 'titre_langue_rubrique', |
|
| 331 | - 'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique', |
|
| 332 | - 'titre' => 'titre, lang', |
|
| 333 | - 'date' => 'date', |
|
| 334 | - 'principale' => 'oui', |
|
| 335 | - 'introduction_longueur' => '600', |
|
| 336 | - 'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'], |
|
| 337 | - 'champs_versionnes' => ['titre', 'descriptif', 'texte'], |
|
| 338 | - 'field' => [ |
|
| 339 | - 'id_rubrique' => 'bigint(21) NOT NULL', |
|
| 340 | - 'id_parent' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 341 | - 'titre' => "text DEFAULT '' NOT NULL", |
|
| 342 | - 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 343 | - 'texte' => "longtext DEFAULT '' NOT NULL", |
|
| 344 | - 'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 345 | - 'maj' => 'TIMESTAMP', |
|
| 346 | - 'statut' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 347 | - 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 348 | - 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 349 | - 'langue_choisie' => "VARCHAR(3) DEFAULT 'non'", |
|
| 350 | - 'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 351 | - 'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 352 | - 'profondeur' => "smallint(5) DEFAULT '0' NOT NULL" |
|
| 353 | - ], |
|
| 354 | - 'key' => [ |
|
| 355 | - 'PRIMARY KEY' => 'id_rubrique', |
|
| 356 | - 'KEY lang' => 'lang', |
|
| 357 | - 'KEY id_parent' => 'id_parent', |
|
| 358 | - ], |
|
| 359 | - 'parent' => [ |
|
| 360 | - ['type' => 'rubrique', 'champ' => 'id_parent'] |
|
| 361 | - ], |
|
| 362 | - 'rechercher_champs' => [ |
|
| 363 | - 'titre' => 8, |
|
| 364 | - 'descriptif' => 5, |
|
| 365 | - 'texte' => 1 |
|
| 366 | - ], |
|
| 367 | - 'statut' => [ |
|
| 368 | - [ |
|
| 369 | - 'champ' => 'statut', |
|
| 370 | - 'publie' => 'publie', |
|
| 371 | - 'previsu' => '!', |
|
| 372 | - 'exception' => ['statut', 'tout'] |
|
| 373 | - ], |
|
| 374 | - ], |
|
| 375 | - 'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas |
|
| 376 | - ], |
|
| 377 | - ], |
|
| 378 | - // toutes les tables ont le droit a une jointure sur les auteurs |
|
| 379 | - ['tables_jointures' => ['id_auteur' => 'auteurs_liens']] |
|
| 380 | - ]; |
|
| 381 | - |
|
| 382 | - // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install |
|
| 383 | - // initialiser la signature |
|
| 384 | - $md5 = md5(serialize($infos_tables)); |
|
| 385 | - |
|
| 386 | - $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']); |
|
| 387 | - $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']); |
|
| 388 | - $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables); |
|
| 389 | - |
|
| 390 | - // completer les informations manquantes ou implicites |
|
| 391 | - $all = []; |
|
| 392 | - foreach (array_keys($infos_tables) as $t) { |
|
| 393 | - // les cles numeriques servent a declarer |
|
| 394 | - // les proprietes applicables a tous les objets |
|
| 395 | - // on les mets de cote |
|
| 396 | - if (is_numeric($t)) { |
|
| 397 | - $all = array_merge_recursive($all, $infos_tables[$t]); |
|
| 398 | - unset($infos_tables[$t]); |
|
| 399 | - } else { |
|
| 400 | - $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]); |
|
| 401 | - } |
|
| 402 | - } |
|
| 403 | - |
|
| 404 | - // repercuter les proprietes generales communes a tous les objets |
|
| 405 | - foreach (array_keys($infos_tables) as $t) { |
|
| 406 | - foreach ($all as $i => $v) { |
|
| 407 | - if (in_array($i, ['tables_jointures', 'champs_versionnes'])) { |
|
| 408 | - $add = $all[$i]; |
|
| 409 | - // eviter les doublons de declaration de table jointure (ex des mots sur auteurs) |
|
| 410 | - // pour les declarations generiques avec cles numeriques |
|
| 411 | - if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) { |
|
| 412 | - $doublons = array_intersect($infos_tables[$t][$i], $add); |
|
| 413 | - foreach ($doublons as $d) { |
|
| 414 | - if ( |
|
| 415 | - is_numeric(array_search($d, $infos_tables[$t][$i])) |
|
| 416 | - and is_numeric($k = array_search($d, $add)) |
|
| 417 | - ) { |
|
| 418 | - unset($add[$k]); |
|
| 419 | - } |
|
| 420 | - } |
|
| 421 | - } |
|
| 422 | - $infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add); |
|
| 423 | - } else { |
|
| 424 | - $infos_tables[$t][$i] = array_merge_recursive( |
|
| 425 | - $infos_tables[$t][$i] ?? [], |
|
| 426 | - $all[$i] |
|
| 427 | - ); |
|
| 428 | - } |
|
| 429 | - } |
|
| 430 | - } |
|
| 431 | - |
|
| 432 | - // completer les tables principales et auxiliaires |
|
| 433 | - // avec celles declarees uniquement dans declarer_table_objets_sql |
|
| 434 | - // pour assurer la compat en transition |
|
| 435 | - foreach ($infos_tables as $table => $infos) { |
|
| 436 | - $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires'); |
|
| 437 | - // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx |
|
| 438 | - // qui a ete appelle avant |
|
| 439 | - $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []); |
|
| 440 | - // l'ajouter au tableau |
|
| 441 | - $GLOBALS[$principale_ou_auxiliaire][$table] = []; |
|
| 442 | - if (isset($infos['field']) and isset($infos['key'])) { |
|
| 443 | - foreach (['field', 'key', 'join'] as $k) { |
|
| 444 | - if (isset($infos_tables[$table][$k])) { |
|
| 445 | - $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k]; |
|
| 446 | - } |
|
| 447 | - } |
|
| 448 | - } else { |
|
| 449 | - // ici on ne renvoie que les declarations, donc RIEN |
|
| 450 | - // pour avoir la vrai description en base, il faut passer par trouver_table |
|
| 451 | - $GLOBALS[$principale_ou_auxiliaire][$table] = []; |
|
| 452 | - } |
|
| 453 | - if (is_countable($mem) ? count($mem) : 0) { |
|
| 454 | - foreach (array_keys($mem) as $k) { |
|
| 455 | - if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) { |
|
| 456 | - $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge( |
|
| 457 | - $GLOBALS[$principale_ou_auxiliaire][$table][$k], |
|
| 458 | - $mem[$k] |
|
| 459 | - ); |
|
| 460 | - } else { |
|
| 461 | - $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k]; |
|
| 462 | - } |
|
| 463 | - } |
|
| 464 | - } |
|
| 465 | - } |
|
| 466 | - |
|
| 467 | - // recuperer les interfaces (table_titre, table_date) |
|
| 468 | - // on ne le fait que dans un second temps pour que table_objet soit fonctionnel |
|
| 469 | - // dans le pipeline de declarer_tables_interfaces |
|
| 470 | - include_spip('public/interfaces'); |
|
| 471 | - foreach (array_keys($infos_tables) as $t) { |
|
| 472 | - $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]); |
|
| 473 | - } |
|
| 474 | - |
|
| 475 | - $deja_la = false; |
|
| 476 | - // signature |
|
| 477 | - $md5 = md5(serialize($infos_tables)); |
|
| 478 | - } |
|
| 479 | - if ($table_sql === '::md5') { |
|
| 480 | - return $md5; |
|
| 481 | - } |
|
| 482 | - if ($table_sql and !isset($infos_tables[$table_sql])) { |
|
| 483 | - #$desc = renseigner_table_objet_sql($table_sql,$desc); |
|
| 484 | - $desc = renseigner_table_objet_interfaces($table_sql, $desc); |
|
| 485 | - |
|
| 486 | - return $desc; |
|
| 487 | - } |
|
| 488 | - if ($table_sql) { |
|
| 489 | - return $infos_tables[$table_sql] ?? []; |
|
| 490 | - } |
|
| 491 | - |
|
| 492 | - return $infos_tables; |
|
| 58 | + static $deja_la = false; |
|
| 59 | + static $infos_tables = null; |
|
| 60 | + static $md5 = null; |
|
| 61 | + static $plugin_hash = null; |
|
| 62 | + |
|
| 63 | + // plugins hash connu ? non si _CACHE_PLUGINS_OPT est pas encore chargé. |
|
| 64 | + $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT'; |
|
| 65 | + |
|
| 66 | + // prealablement recuperer les tables_principales |
|
| 67 | + if (is_null($infos_tables) or $plugin_hash !== $_PLUGINS_HASH) { |
|
| 68 | + // pas de reentrance (cas base/serial) |
|
| 69 | + if ($deja_la) { |
|
| 70 | + spip_log('Re-entrance anormale sur lister_tables_objets_sql : ' |
|
| 71 | + . var_export(debug_backtrace(), true), _LOG_CRITIQUE); |
|
| 72 | + |
|
| 73 | + return ($table_sql === '::md5' ? $md5 : []); |
|
| 74 | + } |
|
| 75 | + $deja_la = true; |
|
| 76 | + $plugin_hash = $_PLUGINS_HASH; // avant de lancer les pipelines |
|
| 77 | + |
|
| 78 | + // recuperer les declarations explicites ancienne mode |
|
| 79 | + // qui servent a completer declarer_tables_objets_sql |
|
| 80 | + base_serial($GLOBALS['tables_principales']); |
|
| 81 | + base_auxiliaires($GLOBALS['tables_auxiliaires']); |
|
| 82 | + $infos_tables = [ |
|
| 83 | + 'spip_articles' => [ |
|
| 84 | + 'page' => 'article', |
|
| 85 | + 'texte_retour' => 'icone_retour_article', |
|
| 86 | + 'texte_modifier' => 'icone_modifier_article', |
|
| 87 | + 'texte_creer' => 'icone_ecrire_article', |
|
| 88 | + 'texte_objets' => 'public:articles', |
|
| 89 | + 'texte_objet' => 'public:article', |
|
| 90 | + 'texte_signale_edition' => 'texte_travail_article', |
|
| 91 | + 'info_aucun_objet' => 'info_aucun_article', |
|
| 92 | + 'info_1_objet' => 'info_1_article', |
|
| 93 | + 'info_nb_objets' => 'info_nb_articles', |
|
| 94 | + 'texte_logo_objet' => 'logo_article', |
|
| 95 | + 'texte_langue_objet' => 'titre_langue_article', |
|
| 96 | + 'texte_definir_comme_traduction_objet' => 'trad_lier', |
|
| 97 | + 'titre' => 'titre, lang', |
|
| 98 | + 'date' => 'date', |
|
| 99 | + 'principale' => 'oui', |
|
| 100 | + 'introduction_longueur' => '500', |
|
| 101 | + 'champs_editables' => [ |
|
| 102 | + 'surtitre', |
|
| 103 | + 'titre', |
|
| 104 | + 'soustitre', |
|
| 105 | + 'descriptif', |
|
| 106 | + 'nom_site', |
|
| 107 | + 'url_site', |
|
| 108 | + 'chapo', |
|
| 109 | + 'texte', |
|
| 110 | + 'ps', |
|
| 111 | + 'virtuel' |
|
| 112 | + ], |
|
| 113 | + 'champs_versionnes' => [ |
|
| 114 | + 'id_rubrique', |
|
| 115 | + 'surtitre', |
|
| 116 | + 'titre', |
|
| 117 | + 'soustitre', |
|
| 118 | + 'jointure_auteurs', |
|
| 119 | + 'descriptif', |
|
| 120 | + 'nom_site', |
|
| 121 | + 'url_site', |
|
| 122 | + 'chapo', |
|
| 123 | + 'texte', |
|
| 124 | + 'ps' |
|
| 125 | + ], |
|
| 126 | + 'field' => [ |
|
| 127 | + 'id_article' => 'bigint(21) NOT NULL', |
|
| 128 | + 'surtitre' => "text DEFAULT '' NOT NULL", |
|
| 129 | + 'titre' => "text DEFAULT '' NOT NULL", |
|
| 130 | + 'soustitre' => "text DEFAULT '' NOT NULL", |
|
| 131 | + 'id_rubrique' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 132 | + 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 133 | + 'chapo' => "mediumtext DEFAULT '' NOT NULL", |
|
| 134 | + 'texte' => "longtext DEFAULT '' NOT NULL", |
|
| 135 | + 'ps' => "mediumtext DEFAULT '' NOT NULL", |
|
| 136 | + 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 137 | + 'statut' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 138 | + 'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 139 | + 'maj' => 'TIMESTAMP', |
|
| 140 | + 'export' => "VARCHAR(10) DEFAULT 'oui'", |
|
| 141 | + 'date_redac' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 142 | + 'visites' => "integer DEFAULT '0' NOT NULL", |
|
| 143 | + 'referers' => "integer DEFAULT '0' NOT NULL", |
|
| 144 | + 'popularite' => "DOUBLE DEFAULT '0' NOT NULL", |
|
| 145 | + 'accepter_forum' => "CHAR(3) DEFAULT '' NOT NULL", |
|
| 146 | + 'date_modif' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 147 | + 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 148 | + 'langue_choisie' => "VARCHAR(3) DEFAULT 'non'", |
|
| 149 | + 'id_trad' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 150 | + 'nom_site' => "tinytext DEFAULT '' NOT NULL", |
|
| 151 | + 'url_site' => "text DEFAULT '' NOT NULL", |
|
| 152 | + 'virtuel' => "text DEFAULT '' NOT NULL", |
|
| 153 | + ], |
|
| 154 | + 'key' => [ |
|
| 155 | + 'PRIMARY KEY' => 'id_article', |
|
| 156 | + 'KEY id_rubrique' => 'id_rubrique', |
|
| 157 | + 'KEY id_secteur' => 'id_secteur', |
|
| 158 | + 'KEY id_trad' => 'id_trad', |
|
| 159 | + 'KEY lang' => 'lang', |
|
| 160 | + 'KEY statut' => 'statut, date', |
|
| 161 | + ], |
|
| 162 | + 'join' => [ |
|
| 163 | + 'id_article' => 'id_article', |
|
| 164 | + 'id_rubrique' => 'id_rubrique' |
|
| 165 | + ], |
|
| 166 | + 'parent' => [ |
|
| 167 | + ['type' => 'rubrique', 'champ' => 'id_rubrique'] |
|
| 168 | + ], |
|
| 169 | + 'rechercher_champs' => [ |
|
| 170 | + 'surtitre' => 5, |
|
| 171 | + 'titre' => 8, |
|
| 172 | + 'soustitre' => 5, |
|
| 173 | + 'chapo' => 3, |
|
| 174 | + 'texte' => 1, |
|
| 175 | + 'ps' => 1, |
|
| 176 | + 'nom_site' => 1, |
|
| 177 | + 'url_site' => 1, |
|
| 178 | + 'descriptif' => 4 |
|
| 179 | + ], |
|
| 180 | + 'rechercher_jointures' => [ |
|
| 181 | + 'auteur' => ['nom' => 10], |
|
| 182 | + ], |
|
| 183 | + 'statut' => [ |
|
| 184 | + [ |
|
| 185 | + 'champ' => 'statut', |
|
| 186 | + 'publie' => 'publie', |
|
| 187 | + 'previsu' => 'publie,prop,prepa/auteur', |
|
| 188 | + 'post_date' => 'date', |
|
| 189 | + 'exception' => ['statut', 'tout'] |
|
| 190 | + ] |
|
| 191 | + ], |
|
| 192 | + 'statut_titres' => [ |
|
| 193 | + 'prepa' => 'info_article_redaction', |
|
| 194 | + 'prop' => 'info_article_propose', |
|
| 195 | + 'publie' => 'info_article_publie', |
|
| 196 | + 'refuse' => 'info_article_refuse', |
|
| 197 | + 'poubelle' => 'info_article_supprime' |
|
| 198 | + ], |
|
| 199 | + 'statut_textes_instituer' => [ |
|
| 200 | + 'prepa' => 'texte_statut_en_cours_redaction', |
|
| 201 | + 'prop' => 'texte_statut_propose_evaluation', |
|
| 202 | + 'publie' => 'texte_statut_publie', |
|
| 203 | + 'refuse' => 'texte_statut_refuse', |
|
| 204 | + 'poubelle' => 'texte_statut_poubelle', |
|
| 205 | + ], |
|
| 206 | + 'texte_changer_statut' => 'texte_article_statut', |
|
| 207 | + 'aide_changer_statut' => 'artstatut', |
|
| 208 | + 'tables_jointures' => [ |
|
| 209 | + 'profondeur' => 'rubriques', |
|
| 210 | + #'id_auteur' => 'auteurs_liens' // declaration generique plus bas |
|
| 211 | + ], |
|
| 212 | + ], |
|
| 213 | + 'spip_auteurs' => [ |
|
| 214 | + 'page' => 'auteur', |
|
| 215 | + 'texte_retour' => 'icone_retour', |
|
| 216 | + 'texte_ajouter' => 'titre_ajouter_un_auteur', |
|
| 217 | + 'texte_modifier' => 'admin_modifier_auteur', |
|
| 218 | + 'texte_objets' => 'icone_auteurs', |
|
| 219 | + 'texte_objet' => 'public:auteur', |
|
| 220 | + 'info_aucun_objet' => 'info_aucun_auteur', |
|
| 221 | + 'info_1_objet' => 'info_1_auteur', |
|
| 222 | + 'info_nb_objets' => 'info_nb_auteurs', |
|
| 223 | + 'texte_logo_objet' => 'logo_auteur', |
|
| 224 | + 'texte_creer_associer' => 'creer_et_associer_un_auteur', |
|
| 225 | + 'titre' => "nom AS titre, '' AS lang", |
|
| 226 | + 'date' => 'date', |
|
| 227 | + 'principale' => 'oui', |
|
| 228 | + 'champs_editables' => ['nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'], |
|
| 229 | + 'champs_versionnes' => ['nom', 'bio', 'email', 'nom_site', 'url_site', 'login'], |
|
| 230 | + 'field' => [ |
|
| 231 | + 'id_auteur' => 'bigint(21) NOT NULL', |
|
| 232 | + 'nom' => "text DEFAULT '' NOT NULL", |
|
| 233 | + 'bio' => "text DEFAULT '' NOT NULL", |
|
| 234 | + 'email' => "tinytext DEFAULT '' NOT NULL", |
|
| 235 | + 'nom_site' => "tinytext DEFAULT '' NOT NULL", |
|
| 236 | + 'url_site' => "text DEFAULT '' NOT NULL", |
|
| 237 | + 'login' => 'VARCHAR(255) BINARY', |
|
| 238 | + 'pass' => "tinytext DEFAULT '' NOT NULL", |
|
| 239 | + 'low_sec' => "tinytext DEFAULT '' NOT NULL", |
|
| 240 | + 'statut' => "varchar(255) DEFAULT '0' NOT NULL", |
|
| 241 | + 'webmestre' => "varchar(3) DEFAULT 'non' NOT NULL", |
|
| 242 | + 'maj' => 'TIMESTAMP', |
|
| 243 | + 'pgp' => "TEXT DEFAULT '' NOT NULL", |
|
| 244 | + 'htpass' => "tinytext DEFAULT '' NOT NULL", |
|
| 245 | + 'en_ligne' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 246 | + 'alea_actuel' => 'tinytext', |
|
| 247 | + 'alea_futur' => 'tinytext', |
|
| 248 | + 'prefs' => 'text', |
|
| 249 | + 'cookie_oubli' => 'tinytext', |
|
| 250 | + 'source' => "VARCHAR(10) DEFAULT 'spip' NOT NULL", |
|
| 251 | + 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 252 | + 'imessage' => "VARCHAR(3) DEFAULT '' NOT NULL", |
|
| 253 | + 'backup_cles' => "mediumtext DEFAULT '' NOT NULL", |
|
| 254 | + ], |
|
| 255 | + 'key' => [ |
|
| 256 | + 'PRIMARY KEY' => 'id_auteur', |
|
| 257 | + 'KEY login' => 'login', |
|
| 258 | + 'KEY statut' => 'statut', |
|
| 259 | + 'KEY en_ligne' => 'en_ligne', |
|
| 260 | + ], |
|
| 261 | + 'join' => [ |
|
| 262 | + 'id_auteur' => 'id_auteur', |
|
| 263 | + 'login' => 'login' |
|
| 264 | + ], |
|
| 265 | + 'rechercher_champs' => [ |
|
| 266 | + 'nom' => 5, |
|
| 267 | + 'bio' => 1, |
|
| 268 | + 'email' => 1, |
|
| 269 | + 'nom_site' => 1, |
|
| 270 | + 'url_site' => 1, |
|
| 271 | + 'login' => 1 |
|
| 272 | + ], |
|
| 273 | + // 2 conditions pour les auteurs : statut!=poubelle, |
|
| 274 | + // et avoir des articles publies |
|
| 275 | + 'statut' => [ |
|
| 276 | + [ |
|
| 277 | + 'champ' => 'statut', |
|
| 278 | + 'publie' => '!5poubelle', |
|
| 279 | + 'previsu' => '!5poubelle', |
|
| 280 | + 'exception' => 'statut' |
|
| 281 | + ], |
|
| 282 | + [ |
|
| 283 | + 'champ' => [ |
|
| 284 | + ['spip_auteurs_liens', 'id_auteur'], |
|
| 285 | + [ |
|
| 286 | + 'spip_articles', |
|
| 287 | + ['id_objet', 'id_article', 'objet', 'article'] |
|
| 288 | + ], |
|
| 289 | + 'statut' |
|
| 290 | + ], |
|
| 291 | + 'publie' => 'publie', |
|
| 292 | + 'previsu' => '!', |
|
| 293 | + 'post_date' => 'date', |
|
| 294 | + 'exception' => ['statut', 'lien', 'tout'] |
|
| 295 | + ], |
|
| 296 | + ], |
|
| 297 | + 'statut_images' => [ |
|
| 298 | + 'auteur-6forum-16.png', |
|
| 299 | + '0minirezo' => 'auteur-0minirezo-16.png', |
|
| 300 | + '1comite' => 'auteur-1comite-16.png', |
|
| 301 | + '6forum' => 'auteur-6forum-16.png', |
|
| 302 | + '5poubelle' => 'auteur-5poubelle-16.png', |
|
| 303 | + 'nouveau' => '' |
|
| 304 | + ], |
|
| 305 | + 'statut_titres' => [ |
|
| 306 | + 'titre_image_visiteur', |
|
| 307 | + '0minirezo' => 'titre_image_administrateur', |
|
| 308 | + '1comite' => 'titre_image_redacteur_02', |
|
| 309 | + '6forum' => 'titre_image_visiteur', |
|
| 310 | + '5poubelle' => 'titre_image_auteur_supprime', |
|
| 311 | + ], |
|
| 312 | + 'tables_jointures' => [#'auteurs_liens' // declaration generique plus bas |
|
| 313 | + ], |
|
| 314 | + ], |
|
| 315 | + 'spip_rubriques' => [ |
|
| 316 | + 'page' => 'rubrique', |
|
| 317 | + 'url_voir' => 'rubrique', |
|
| 318 | + 'url_edit' => 'rubrique_edit', |
|
| 319 | + 'texte_retour' => 'icone_retour', |
|
| 320 | + 'texte_objets' => 'public:rubriques', |
|
| 321 | + 'texte_objet' => 'public:rubrique', |
|
| 322 | + 'texte_modifier' => 'icone_modifier_rubrique', |
|
| 323 | + 'texte_creer' => 'icone_creer_rubrique', |
|
| 324 | + 'texte_ajouter' => 'titre_ajouter_une_rubrique', |
|
| 325 | + 'texte_creer_associer' => 'creer_et_associer_une_rubrique', |
|
| 326 | + 'info_aucun_objet' => 'info_aucun_rubrique', |
|
| 327 | + 'info_1_objet' => 'info_1_rubrique', |
|
| 328 | + 'info_nb_objets' => 'info_nb_rubriques', |
|
| 329 | + 'texte_logo_objet' => 'logo_rubrique', |
|
| 330 | + 'texte_langue_objet' => 'titre_langue_rubrique', |
|
| 331 | + 'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique', |
|
| 332 | + 'titre' => 'titre, lang', |
|
| 333 | + 'date' => 'date', |
|
| 334 | + 'principale' => 'oui', |
|
| 335 | + 'introduction_longueur' => '600', |
|
| 336 | + 'champs_editables' => ['titre', 'texte', 'descriptif', 'extra'], |
|
| 337 | + 'champs_versionnes' => ['titre', 'descriptif', 'texte'], |
|
| 338 | + 'field' => [ |
|
| 339 | + 'id_rubrique' => 'bigint(21) NOT NULL', |
|
| 340 | + 'id_parent' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 341 | + 'titre' => "text DEFAULT '' NOT NULL", |
|
| 342 | + 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 343 | + 'texte' => "longtext DEFAULT '' NOT NULL", |
|
| 344 | + 'id_secteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 345 | + 'maj' => 'TIMESTAMP', |
|
| 346 | + 'statut' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 347 | + 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 348 | + 'lang' => "VARCHAR(10) DEFAULT '' NOT NULL", |
|
| 349 | + 'langue_choisie' => "VARCHAR(3) DEFAULT 'non'", |
|
| 350 | + 'statut_tmp' => "varchar(10) DEFAULT '0' NOT NULL", |
|
| 351 | + 'date_tmp' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", |
|
| 352 | + 'profondeur' => "smallint(5) DEFAULT '0' NOT NULL" |
|
| 353 | + ], |
|
| 354 | + 'key' => [ |
|
| 355 | + 'PRIMARY KEY' => 'id_rubrique', |
|
| 356 | + 'KEY lang' => 'lang', |
|
| 357 | + 'KEY id_parent' => 'id_parent', |
|
| 358 | + ], |
|
| 359 | + 'parent' => [ |
|
| 360 | + ['type' => 'rubrique', 'champ' => 'id_parent'] |
|
| 361 | + ], |
|
| 362 | + 'rechercher_champs' => [ |
|
| 363 | + 'titre' => 8, |
|
| 364 | + 'descriptif' => 5, |
|
| 365 | + 'texte' => 1 |
|
| 366 | + ], |
|
| 367 | + 'statut' => [ |
|
| 368 | + [ |
|
| 369 | + 'champ' => 'statut', |
|
| 370 | + 'publie' => 'publie', |
|
| 371 | + 'previsu' => '!', |
|
| 372 | + 'exception' => ['statut', 'tout'] |
|
| 373 | + ], |
|
| 374 | + ], |
|
| 375 | + 'tables_jointures' => [#'id_auteur' => 'auteurs_liens' // declaration generique plus bas |
|
| 376 | + ], |
|
| 377 | + ], |
|
| 378 | + // toutes les tables ont le droit a une jointure sur les auteurs |
|
| 379 | + ['tables_jointures' => ['id_auteur' => 'auteurs_liens']] |
|
| 380 | + ]; |
|
| 381 | + |
|
| 382 | + // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install |
|
| 383 | + // initialiser la signature |
|
| 384 | + $md5 = md5(serialize($infos_tables)); |
|
| 385 | + |
|
| 386 | + $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']); |
|
| 387 | + $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']); |
|
| 388 | + $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables); |
|
| 389 | + |
|
| 390 | + // completer les informations manquantes ou implicites |
|
| 391 | + $all = []; |
|
| 392 | + foreach (array_keys($infos_tables) as $t) { |
|
| 393 | + // les cles numeriques servent a declarer |
|
| 394 | + // les proprietes applicables a tous les objets |
|
| 395 | + // on les mets de cote |
|
| 396 | + if (is_numeric($t)) { |
|
| 397 | + $all = array_merge_recursive($all, $infos_tables[$t]); |
|
| 398 | + unset($infos_tables[$t]); |
|
| 399 | + } else { |
|
| 400 | + $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]); |
|
| 401 | + } |
|
| 402 | + } |
|
| 403 | + |
|
| 404 | + // repercuter les proprietes generales communes a tous les objets |
|
| 405 | + foreach (array_keys($infos_tables) as $t) { |
|
| 406 | + foreach ($all as $i => $v) { |
|
| 407 | + if (in_array($i, ['tables_jointures', 'champs_versionnes'])) { |
|
| 408 | + $add = $all[$i]; |
|
| 409 | + // eviter les doublons de declaration de table jointure (ex des mots sur auteurs) |
|
| 410 | + // pour les declarations generiques avec cles numeriques |
|
| 411 | + if ($i == 'tables_jointures' and isset($infos_tables[$t][$i]) and is_countable($infos_tables[$t][$i]) ? count($infos_tables[$t][$i]) : 0) { |
|
| 412 | + $doublons = array_intersect($infos_tables[$t][$i], $add); |
|
| 413 | + foreach ($doublons as $d) { |
|
| 414 | + if ( |
|
| 415 | + is_numeric(array_search($d, $infos_tables[$t][$i])) |
|
| 416 | + and is_numeric($k = array_search($d, $add)) |
|
| 417 | + ) { |
|
| 418 | + unset($add[$k]); |
|
| 419 | + } |
|
| 420 | + } |
|
| 421 | + } |
|
| 422 | + $infos_tables[$t][$i] = array_merge($infos_tables[$t][$i] ?? [], $add); |
|
| 423 | + } else { |
|
| 424 | + $infos_tables[$t][$i] = array_merge_recursive( |
|
| 425 | + $infos_tables[$t][$i] ?? [], |
|
| 426 | + $all[$i] |
|
| 427 | + ); |
|
| 428 | + } |
|
| 429 | + } |
|
| 430 | + } |
|
| 431 | + |
|
| 432 | + // completer les tables principales et auxiliaires |
|
| 433 | + // avec celles declarees uniquement dans declarer_table_objets_sql |
|
| 434 | + // pour assurer la compat en transition |
|
| 435 | + foreach ($infos_tables as $table => $infos) { |
|
| 436 | + $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires'); |
|
| 437 | + // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx |
|
| 438 | + // qui a ete appelle avant |
|
| 439 | + $mem = ($GLOBALS[$principale_ou_auxiliaire][$table] ?? []); |
|
| 440 | + // l'ajouter au tableau |
|
| 441 | + $GLOBALS[$principale_ou_auxiliaire][$table] = []; |
|
| 442 | + if (isset($infos['field']) and isset($infos['key'])) { |
|
| 443 | + foreach (['field', 'key', 'join'] as $k) { |
|
| 444 | + if (isset($infos_tables[$table][$k])) { |
|
| 445 | + $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k]; |
|
| 446 | + } |
|
| 447 | + } |
|
| 448 | + } else { |
|
| 449 | + // ici on ne renvoie que les declarations, donc RIEN |
|
| 450 | + // pour avoir la vrai description en base, il faut passer par trouver_table |
|
| 451 | + $GLOBALS[$principale_ou_auxiliaire][$table] = []; |
|
| 452 | + } |
|
| 453 | + if (is_countable($mem) ? count($mem) : 0) { |
|
| 454 | + foreach (array_keys($mem) as $k) { |
|
| 455 | + if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) { |
|
| 456 | + $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge( |
|
| 457 | + $GLOBALS[$principale_ou_auxiliaire][$table][$k], |
|
| 458 | + $mem[$k] |
|
| 459 | + ); |
|
| 460 | + } else { |
|
| 461 | + $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k]; |
|
| 462 | + } |
|
| 463 | + } |
|
| 464 | + } |
|
| 465 | + } |
|
| 466 | + |
|
| 467 | + // recuperer les interfaces (table_titre, table_date) |
|
| 468 | + // on ne le fait que dans un second temps pour que table_objet soit fonctionnel |
|
| 469 | + // dans le pipeline de declarer_tables_interfaces |
|
| 470 | + include_spip('public/interfaces'); |
|
| 471 | + foreach (array_keys($infos_tables) as $t) { |
|
| 472 | + $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]); |
|
| 473 | + } |
|
| 474 | + |
|
| 475 | + $deja_la = false; |
|
| 476 | + // signature |
|
| 477 | + $md5 = md5(serialize($infos_tables)); |
|
| 478 | + } |
|
| 479 | + if ($table_sql === '::md5') { |
|
| 480 | + return $md5; |
|
| 481 | + } |
|
| 482 | + if ($table_sql and !isset($infos_tables[$table_sql])) { |
|
| 483 | + #$desc = renseigner_table_objet_sql($table_sql,$desc); |
|
| 484 | + $desc = renseigner_table_objet_interfaces($table_sql, $desc); |
|
| 485 | + |
|
| 486 | + return $desc; |
|
| 487 | + } |
|
| 488 | + if ($table_sql) { |
|
| 489 | + return $infos_tables[$table_sql] ?? []; |
|
| 490 | + } |
|
| 491 | + |
|
| 492 | + return $infos_tables; |
|
| 493 | 493 | } |
| 494 | 494 | |
| 495 | 495 | |
@@ -504,27 +504,27 @@ discard block |
||
| 504 | 504 | **/ |
| 505 | 505 | function base_serial(&$tables_principales) { |
| 506 | 506 | |
| 507 | - $spip_jobs = [ |
|
| 508 | - 'id_job' => 'bigint(21) NOT NULL', |
|
| 509 | - 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 510 | - 'fonction' => 'varchar(255) NOT NULL', //nom de la fonction |
|
| 511 | - 'args' => "longblob DEFAULT '' NOT NULL", // arguments |
|
| 512 | - 'md5args' => "char(32) NOT NULL default ''", // signature des arguments |
|
| 513 | - 'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction |
|
| 514 | - 'priorite' => 'smallint(6) NOT NULL default 0', |
|
| 515 | - 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot |
|
| 516 | - 'status' => 'tinyint NOT NULL default 1', |
|
| 517 | - ]; |
|
| 518 | - |
|
| 519 | - $spip_jobs_key = [ |
|
| 520 | - 'PRIMARY KEY' => 'id_job', |
|
| 521 | - 'KEY date' => 'date', |
|
| 522 | - 'KEY status' => 'status', |
|
| 523 | - ]; |
|
| 524 | - |
|
| 525 | - /// Attention: mes_fonctions peut avoir deja defini cette variable |
|
| 526 | - /// il faut donc rajouter, mais pas reinitialiser |
|
| 527 | - $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key]; |
|
| 507 | + $spip_jobs = [ |
|
| 508 | + 'id_job' => 'bigint(21) NOT NULL', |
|
| 509 | + 'descriptif' => "text DEFAULT '' NOT NULL", |
|
| 510 | + 'fonction' => 'varchar(255) NOT NULL', //nom de la fonction |
|
| 511 | + 'args' => "longblob DEFAULT '' NOT NULL", // arguments |
|
| 512 | + 'md5args' => "char(32) NOT NULL default ''", // signature des arguments |
|
| 513 | + 'inclure' => 'varchar(255) NOT NULL', // fichier a inclure ou path/ pour charger_fonction |
|
| 514 | + 'priorite' => 'smallint(6) NOT NULL default 0', |
|
| 515 | + 'date' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot |
|
| 516 | + 'status' => 'tinyint NOT NULL default 1', |
|
| 517 | + ]; |
|
| 518 | + |
|
| 519 | + $spip_jobs_key = [ |
|
| 520 | + 'PRIMARY KEY' => 'id_job', |
|
| 521 | + 'KEY date' => 'date', |
|
| 522 | + 'KEY status' => 'status', |
|
| 523 | + ]; |
|
| 524 | + |
|
| 525 | + /// Attention: mes_fonctions peut avoir deja defini cette variable |
|
| 526 | + /// il faut donc rajouter, mais pas reinitialiser |
|
| 527 | + $tables_principales['spip_jobs'] = ['field' => &$spip_jobs, 'key' => &$spip_jobs_key]; |
|
| 528 | 528 | } |
| 529 | 529 | |
| 530 | 530 | |
@@ -536,71 +536,71 @@ discard block |
||
| 536 | 536 | * @return void |
| 537 | 537 | **/ |
| 538 | 538 | function base_auxiliaires(&$tables_auxiliaires) { |
| 539 | - $spip_resultats = [ |
|
| 540 | - 'recherche' => "char(16) DEFAULT '' NOT NULL", |
|
| 541 | - 'id' => 'INT UNSIGNED NOT NULL', |
|
| 542 | - 'points' => "INT UNSIGNED DEFAULT '0' NOT NULL", |
|
| 543 | - 'table_objet' => "varchar(30) DEFAULT '' NOT NULL", |
|
| 544 | - 'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal) |
|
| 545 | - 'maj' => 'TIMESTAMP' |
|
| 546 | - ]; |
|
| 547 | - |
|
| 548 | - $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ... |
|
| 549 | - ]; |
|
| 550 | - |
|
| 551 | - $spip_auteurs_liens = [ |
|
| 552 | - 'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 553 | - 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 554 | - 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", |
|
| 555 | - 'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL" |
|
| 556 | - ]; |
|
| 557 | - |
|
| 558 | - $spip_auteurs_liens_key = [ |
|
| 559 | - 'PRIMARY KEY' => 'id_auteur,id_objet,objet', |
|
| 560 | - 'KEY id_auteur' => 'id_auteur', |
|
| 561 | - 'KEY id_objet' => 'id_objet', |
|
| 562 | - 'KEY objet' => 'objet', |
|
| 563 | - ]; |
|
| 564 | - |
|
| 565 | - $spip_meta = [ |
|
| 566 | - 'nom' => 'VARCHAR (255) NOT NULL', |
|
| 567 | - 'valeur' => "text DEFAULT ''", |
|
| 568 | - 'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL", |
|
| 569 | - 'maj' => 'TIMESTAMP' |
|
| 570 | - ]; |
|
| 571 | - |
|
| 572 | - $spip_meta_key = [ |
|
| 573 | - 'PRIMARY KEY' => 'nom' |
|
| 574 | - ]; |
|
| 575 | - |
|
| 576 | - $spip_jobs_liens = [ |
|
| 577 | - 'id_job' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 578 | - 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 579 | - 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", |
|
| 580 | - ]; |
|
| 581 | - |
|
| 582 | - $spip_jobs_liens_key = [ |
|
| 583 | - 'PRIMARY KEY' => 'id_job,id_objet,objet', |
|
| 584 | - 'KEY id_job' => 'id_job' |
|
| 585 | - ]; |
|
| 586 | - |
|
| 587 | - $tables_auxiliaires['spip_auteurs_liens'] = [ |
|
| 588 | - 'field' => &$spip_auteurs_liens, |
|
| 589 | - 'key' => &$spip_auteurs_liens_key |
|
| 590 | - ]; |
|
| 591 | - |
|
| 592 | - $tables_auxiliaires['spip_meta'] = [ |
|
| 593 | - 'field' => &$spip_meta, |
|
| 594 | - 'key' => &$spip_meta_key |
|
| 595 | - ]; |
|
| 596 | - $tables_auxiliaires['spip_resultats'] = [ |
|
| 597 | - 'field' => &$spip_resultats, |
|
| 598 | - 'key' => &$spip_resultats_key |
|
| 599 | - ]; |
|
| 600 | - $tables_auxiliaires['spip_jobs_liens'] = [ |
|
| 601 | - 'field' => &$spip_jobs_liens, |
|
| 602 | - 'key' => &$spip_jobs_liens_key |
|
| 603 | - ]; |
|
| 539 | + $spip_resultats = [ |
|
| 540 | + 'recherche' => "char(16) DEFAULT '' NOT NULL", |
|
| 541 | + 'id' => 'INT UNSIGNED NOT NULL', |
|
| 542 | + 'points' => "INT UNSIGNED DEFAULT '0' NOT NULL", |
|
| 543 | + 'table_objet' => "varchar(30) DEFAULT '' NOT NULL", |
|
| 544 | + 'serveur' => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal) |
|
| 545 | + 'maj' => 'TIMESTAMP' |
|
| 546 | + ]; |
|
| 547 | + |
|
| 548 | + $spip_resultats_key = [// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ... |
|
| 549 | + ]; |
|
| 550 | + |
|
| 551 | + $spip_auteurs_liens = [ |
|
| 552 | + 'id_auteur' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 553 | + 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 554 | + 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", |
|
| 555 | + 'vu' => "VARCHAR(6) DEFAULT 'non' NOT NULL" |
|
| 556 | + ]; |
|
| 557 | + |
|
| 558 | + $spip_auteurs_liens_key = [ |
|
| 559 | + 'PRIMARY KEY' => 'id_auteur,id_objet,objet', |
|
| 560 | + 'KEY id_auteur' => 'id_auteur', |
|
| 561 | + 'KEY id_objet' => 'id_objet', |
|
| 562 | + 'KEY objet' => 'objet', |
|
| 563 | + ]; |
|
| 564 | + |
|
| 565 | + $spip_meta = [ |
|
| 566 | + 'nom' => 'VARCHAR (255) NOT NULL', |
|
| 567 | + 'valeur' => "text DEFAULT ''", |
|
| 568 | + 'impt' => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL", |
|
| 569 | + 'maj' => 'TIMESTAMP' |
|
| 570 | + ]; |
|
| 571 | + |
|
| 572 | + $spip_meta_key = [ |
|
| 573 | + 'PRIMARY KEY' => 'nom' |
|
| 574 | + ]; |
|
| 575 | + |
|
| 576 | + $spip_jobs_liens = [ |
|
| 577 | + 'id_job' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 578 | + 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", |
|
| 579 | + 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", |
|
| 580 | + ]; |
|
| 581 | + |
|
| 582 | + $spip_jobs_liens_key = [ |
|
| 583 | + 'PRIMARY KEY' => 'id_job,id_objet,objet', |
|
| 584 | + 'KEY id_job' => 'id_job' |
|
| 585 | + ]; |
|
| 586 | + |
|
| 587 | + $tables_auxiliaires['spip_auteurs_liens'] = [ |
|
| 588 | + 'field' => &$spip_auteurs_liens, |
|
| 589 | + 'key' => &$spip_auteurs_liens_key |
|
| 590 | + ]; |
|
| 591 | + |
|
| 592 | + $tables_auxiliaires['spip_meta'] = [ |
|
| 593 | + 'field' => &$spip_meta, |
|
| 594 | + 'key' => &$spip_meta_key |
|
| 595 | + ]; |
|
| 596 | + $tables_auxiliaires['spip_resultats'] = [ |
|
| 597 | + 'field' => &$spip_resultats, |
|
| 598 | + 'key' => &$spip_resultats_key |
|
| 599 | + ]; |
|
| 600 | + $tables_auxiliaires['spip_jobs_liens'] = [ |
|
| 601 | + 'field' => &$spip_jobs_liens, |
|
| 602 | + 'key' => &$spip_jobs_liens_key |
|
| 603 | + ]; |
|
| 604 | 604 | } |
| 605 | 605 | |
| 606 | 606 | |
@@ -657,129 +657,129 @@ discard block |
||
| 657 | 657 | * @return array |
| 658 | 658 | */ |
| 659 | 659 | function renseigner_table_objet_sql($table_sql, &$infos) { |
| 660 | - if (!isset($infos['type'])) { |
|
| 661 | - // si on arrive de base/trouver_table, on a la cle primaire : |
|
| 662 | - // s'en servir pour extrapoler le type |
|
| 663 | - if (isset($infos['key']['PRIMARY KEY'])) { |
|
| 664 | - $primary = $infos['key']['PRIMARY KEY']; |
|
| 665 | - $primary = explode(',', $primary); |
|
| 666 | - $primary = reset($primary); |
|
| 667 | - $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary); |
|
| 668 | - } else { |
|
| 669 | - $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql); |
|
| 670 | - } |
|
| 671 | - } |
|
| 672 | - if (!isset($infos['type_surnoms'])) { |
|
| 673 | - $infos['type_surnoms'] = []; |
|
| 674 | - } |
|
| 675 | - |
|
| 676 | - if (!isset($infos['table_objet'])) { |
|
| 677 | - $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql); |
|
| 678 | - } |
|
| 679 | - if (!isset($infos['table_objet_surnoms'])) { |
|
| 680 | - $infos['table_objet_surnoms'] = []; |
|
| 681 | - } |
|
| 682 | - |
|
| 683 | - if (!isset($infos['principale'])) { |
|
| 684 | - $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false); |
|
| 685 | - } |
|
| 686 | - |
|
| 687 | - // normaliser pour pouvoir tester en php $infos['principale']? |
|
| 688 | - // et dans une boucle {principale=oui} |
|
| 689 | - $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false); |
|
| 690 | - |
|
| 691 | - // declarer et normaliser pour pouvoir tester en php $infos['editable']? |
|
| 692 | - // et dans une boucle {editable=oui} |
|
| 693 | - if (!isset($infos['editable'])) { |
|
| 694 | - $infos['editable'] = 'oui'; |
|
| 695 | - } |
|
| 696 | - |
|
| 697 | - $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false); |
|
| 698 | - |
|
| 699 | - // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres |
|
| 700 | - // seules les exceptions sont donc a declarer |
|
| 701 | - if (!isset($infos['page'])) { |
|
| 702 | - $infos['page'] = ($infos['principale'] ? $infos['type'] : ''); |
|
| 703 | - } |
|
| 704 | - |
|
| 705 | - if (!isset($infos['url_voir'])) { |
|
| 706 | - $infos['url_voir'] = $infos['type']; |
|
| 707 | - } |
|
| 708 | - if (!isset($infos['url_edit'])) { |
|
| 709 | - $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : ''); |
|
| 710 | - } |
|
| 711 | - if (!isset($infos['icone_objet'])) { |
|
| 712 | - $infos['icone_objet'] = $infos['type']; |
|
| 713 | - } |
|
| 714 | - |
|
| 715 | - // chaines de langue |
|
| 716 | - // par defaut : objet:icone_xxx_objet |
|
| 717 | - if (!isset($infos['texte_retour'])) { |
|
| 718 | - $infos['texte_retour'] = 'icone_retour'; |
|
| 719 | - } |
|
| 720 | - if (!isset($infos['texte_modifier'])) { |
|
| 721 | - $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type']; |
|
| 722 | - } |
|
| 723 | - if (!isset($infos['texte_creer'])) { |
|
| 724 | - $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type']; |
|
| 725 | - } |
|
| 726 | - if (!isset($infos['texte_creer_associer'])) { |
|
| 727 | - $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type']; |
|
| 728 | - } |
|
| 729 | - if (!isset($infos['texte_ajouter'])) { |
|
| 730 | - // Ajouter un X |
|
| 731 | - $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type']; |
|
| 732 | - } |
|
| 733 | - if (!isset($infos['texte_objets'])) { |
|
| 734 | - $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet']; |
|
| 735 | - } |
|
| 736 | - if (!isset($infos['texte_objet'])) { |
|
| 737 | - $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type']; |
|
| 738 | - } |
|
| 739 | - if (!isset($infos['texte_logo_objet'])) { |
|
| 740 | - // objet:titre_logo_objet "Logo de ce X" |
|
| 741 | - $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type']; |
|
| 742 | - } |
|
| 743 | - if (!isset($infos['texte_langue_objet'])) { |
|
| 744 | - // objet:texte_langue_objet "Langue de ce X" |
|
| 745 | - $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type']; |
|
| 746 | - } |
|
| 747 | - if (!isset($infos['texte_definir_comme_traduction_objet'])) { |
|
| 748 | - // "Ce X est une traduction du X numéro :" |
|
| 749 | - $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type']; |
|
| 750 | - } |
|
| 751 | - |
|
| 752 | - // objet:info_aucun_objet |
|
| 753 | - if (!isset($infos['info_aucun_objet'])) { |
|
| 754 | - $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type']; |
|
| 755 | - } |
|
| 756 | - // objet:info_1_objet |
|
| 757 | - if (!isset($infos['info_1_objet'])) { |
|
| 758 | - $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type']; |
|
| 759 | - } |
|
| 760 | - // objet:info_nb_objets |
|
| 761 | - if (!isset($infos['info_nb_objets'])) { |
|
| 762 | - $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet']; |
|
| 763 | - } |
|
| 764 | - |
|
| 765 | - if (!isset($infos['champs_editables'])) { |
|
| 766 | - $infos['champs_editables'] = []; |
|
| 767 | - } |
|
| 768 | - if (!isset($infos['champs_versionnes'])) { |
|
| 769 | - $infos['champs_versionnes'] = []; |
|
| 770 | - } |
|
| 771 | - if (!isset($infos['rechercher_champs'])) { |
|
| 772 | - $infos['rechercher_champs'] = []; |
|
| 773 | - } |
|
| 774 | - if (!isset($infos['rechercher_jointures'])) { |
|
| 775 | - $infos['rechercher_jointures'] = []; |
|
| 776 | - } |
|
| 777 | - |
|
| 778 | - if (!isset($infos['modeles'])) { |
|
| 779 | - $infos['modeles'] = [$infos['type']]; |
|
| 780 | - } |
|
| 781 | - |
|
| 782 | - return $infos; |
|
| 660 | + if (!isset($infos['type'])) { |
|
| 661 | + // si on arrive de base/trouver_table, on a la cle primaire : |
|
| 662 | + // s'en servir pour extrapoler le type |
|
| 663 | + if (isset($infos['key']['PRIMARY KEY'])) { |
|
| 664 | + $primary = $infos['key']['PRIMARY KEY']; |
|
| 665 | + $primary = explode(',', $primary); |
|
| 666 | + $primary = reset($primary); |
|
| 667 | + $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary); |
|
| 668 | + } else { |
|
| 669 | + $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql); |
|
| 670 | + } |
|
| 671 | + } |
|
| 672 | + if (!isset($infos['type_surnoms'])) { |
|
| 673 | + $infos['type_surnoms'] = []; |
|
| 674 | + } |
|
| 675 | + |
|
| 676 | + if (!isset($infos['table_objet'])) { |
|
| 677 | + $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql); |
|
| 678 | + } |
|
| 679 | + if (!isset($infos['table_objet_surnoms'])) { |
|
| 680 | + $infos['table_objet_surnoms'] = []; |
|
| 681 | + } |
|
| 682 | + |
|
| 683 | + if (!isset($infos['principale'])) { |
|
| 684 | + $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false); |
|
| 685 | + } |
|
| 686 | + |
|
| 687 | + // normaliser pour pouvoir tester en php $infos['principale']? |
|
| 688 | + // et dans une boucle {principale=oui} |
|
| 689 | + $infos['principale'] = (($infos['principale'] and $infos['principale'] != 'non') ? 'oui' : false); |
|
| 690 | + |
|
| 691 | + // declarer et normaliser pour pouvoir tester en php $infos['editable']? |
|
| 692 | + // et dans une boucle {editable=oui} |
|
| 693 | + if (!isset($infos['editable'])) { |
|
| 694 | + $infos['editable'] = 'oui'; |
|
| 695 | + } |
|
| 696 | + |
|
| 697 | + $infos['editable'] = (($infos['editable'] and $infos['editable'] != 'non') ? 'oui' : false); |
|
| 698 | + |
|
| 699 | + // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres |
|
| 700 | + // seules les exceptions sont donc a declarer |
|
| 701 | + if (!isset($infos['page'])) { |
|
| 702 | + $infos['page'] = ($infos['principale'] ? $infos['type'] : ''); |
|
| 703 | + } |
|
| 704 | + |
|
| 705 | + if (!isset($infos['url_voir'])) { |
|
| 706 | + $infos['url_voir'] = $infos['type']; |
|
| 707 | + } |
|
| 708 | + if (!isset($infos['url_edit'])) { |
|
| 709 | + $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : ''); |
|
| 710 | + } |
|
| 711 | + if (!isset($infos['icone_objet'])) { |
|
| 712 | + $infos['icone_objet'] = $infos['type']; |
|
| 713 | + } |
|
| 714 | + |
|
| 715 | + // chaines de langue |
|
| 716 | + // par defaut : objet:icone_xxx_objet |
|
| 717 | + if (!isset($infos['texte_retour'])) { |
|
| 718 | + $infos['texte_retour'] = 'icone_retour'; |
|
| 719 | + } |
|
| 720 | + if (!isset($infos['texte_modifier'])) { |
|
| 721 | + $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type']; |
|
| 722 | + } |
|
| 723 | + if (!isset($infos['texte_creer'])) { |
|
| 724 | + $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type']; |
|
| 725 | + } |
|
| 726 | + if (!isset($infos['texte_creer_associer'])) { |
|
| 727 | + $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type']; |
|
| 728 | + } |
|
| 729 | + if (!isset($infos['texte_ajouter'])) { |
|
| 730 | + // Ajouter un X |
|
| 731 | + $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type']; |
|
| 732 | + } |
|
| 733 | + if (!isset($infos['texte_objets'])) { |
|
| 734 | + $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet']; |
|
| 735 | + } |
|
| 736 | + if (!isset($infos['texte_objet'])) { |
|
| 737 | + $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type']; |
|
| 738 | + } |
|
| 739 | + if (!isset($infos['texte_logo_objet'])) { |
|
| 740 | + // objet:titre_logo_objet "Logo de ce X" |
|
| 741 | + $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type']; |
|
| 742 | + } |
|
| 743 | + if (!isset($infos['texte_langue_objet'])) { |
|
| 744 | + // objet:texte_langue_objet "Langue de ce X" |
|
| 745 | + $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type']; |
|
| 746 | + } |
|
| 747 | + if (!isset($infos['texte_definir_comme_traduction_objet'])) { |
|
| 748 | + // "Ce X est une traduction du X numéro :" |
|
| 749 | + $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type']; |
|
| 750 | + } |
|
| 751 | + |
|
| 752 | + // objet:info_aucun_objet |
|
| 753 | + if (!isset($infos['info_aucun_objet'])) { |
|
| 754 | + $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type']; |
|
| 755 | + } |
|
| 756 | + // objet:info_1_objet |
|
| 757 | + if (!isset($infos['info_1_objet'])) { |
|
| 758 | + $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type']; |
|
| 759 | + } |
|
| 760 | + // objet:info_nb_objets |
|
| 761 | + if (!isset($infos['info_nb_objets'])) { |
|
| 762 | + $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet']; |
|
| 763 | + } |
|
| 764 | + |
|
| 765 | + if (!isset($infos['champs_editables'])) { |
|
| 766 | + $infos['champs_editables'] = []; |
|
| 767 | + } |
|
| 768 | + if (!isset($infos['champs_versionnes'])) { |
|
| 769 | + $infos['champs_versionnes'] = []; |
|
| 770 | + } |
|
| 771 | + if (!isset($infos['rechercher_champs'])) { |
|
| 772 | + $infos['rechercher_champs'] = []; |
|
| 773 | + } |
|
| 774 | + if (!isset($infos['rechercher_jointures'])) { |
|
| 775 | + $infos['rechercher_jointures'] = []; |
|
| 776 | + } |
|
| 777 | + |
|
| 778 | + if (!isset($infos['modeles'])) { |
|
| 779 | + $infos['modeles'] = [$infos['type']]; |
|
| 780 | + } |
|
| 781 | + |
|
| 782 | + return $infos; |
|
| 783 | 783 | } |
| 784 | 784 | |
| 785 | 785 | /** |
@@ -796,30 +796,30 @@ discard block |
||
| 796 | 796 | * @return array |
| 797 | 797 | */ |
| 798 | 798 | function renseigner_table_objet_interfaces($table_sql, &$infos) { |
| 799 | - if (!isset($infos['titre'])) { |
|
| 800 | - if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) { |
|
| 801 | - $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']]; |
|
| 802 | - } else { |
|
| 803 | - $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,"); |
|
| 804 | - $infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang"); |
|
| 805 | - } |
|
| 806 | - } |
|
| 807 | - if (!isset($infos['date'])) { |
|
| 808 | - if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) { |
|
| 809 | - $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']]; |
|
| 810 | - } else { |
|
| 811 | - $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : ''); |
|
| 812 | - } |
|
| 813 | - } |
|
| 814 | - |
|
| 815 | - $infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? ''; |
|
| 816 | - $infos['tables_jointures'] ??= []; |
|
| 817 | - |
|
| 818 | - if (isset($GLOBALS['tables_jointures'][$table_sql])) { |
|
| 819 | - $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]); |
|
| 820 | - } |
|
| 821 | - |
|
| 822 | - return $infos; |
|
| 799 | + if (!isset($infos['titre'])) { |
|
| 800 | + if (isset($infos['table_objet']) and isset($GLOBALS['table_titre'][$infos['table_objet']])) { |
|
| 801 | + $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']]; |
|
| 802 | + } else { |
|
| 803 | + $infos['titre'] = ((isset($infos['field']['titre'])) ? 'titre,' : "'' as titre,"); |
|
| 804 | + $infos['titre'] .= ((isset($infos['field']['lang'])) ? 'lang' : "'' as lang"); |
|
| 805 | + } |
|
| 806 | + } |
|
| 807 | + if (!isset($infos['date'])) { |
|
| 808 | + if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) { |
|
| 809 | + $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']]; |
|
| 810 | + } else { |
|
| 811 | + $infos['date'] = ((isset($infos['field']['date'])) ? 'date' : ''); |
|
| 812 | + } |
|
| 813 | + } |
|
| 814 | + |
|
| 815 | + $infos['statut'] ??= $GLOBALS['table_statut'][$table_sql] ?? ''; |
|
| 816 | + $infos['tables_jointures'] ??= []; |
|
| 817 | + |
|
| 818 | + if (isset($GLOBALS['tables_jointures'][$table_sql])) { |
|
| 819 | + $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]); |
|
| 820 | + } |
|
| 821 | + |
|
| 822 | + return $infos; |
|
| 823 | 823 | } |
| 824 | 824 | |
| 825 | 825 | /** |
@@ -830,13 +830,13 @@ discard block |
||
| 830 | 830 | * Liste et descriptions des tables principales |
| 831 | 831 | **/ |
| 832 | 832 | function lister_tables_principales() { |
| 833 | - static $done = false; |
|
| 834 | - if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) { |
|
| 835 | - lister_tables_objets_sql(); |
|
| 836 | - $done = true; |
|
| 837 | - } |
|
| 833 | + static $done = false; |
|
| 834 | + if (!$done or !(is_countable($GLOBALS['tables_principales']) ? count($GLOBALS['tables_principales']) : 0)) { |
|
| 835 | + lister_tables_objets_sql(); |
|
| 836 | + $done = true; |
|
| 837 | + } |
|
| 838 | 838 | |
| 839 | - return $GLOBALS['tables_principales']; |
|
| 839 | + return $GLOBALS['tables_principales']; |
|
| 840 | 840 | } |
| 841 | 841 | |
| 842 | 842 | /** |
@@ -847,13 +847,13 @@ discard block |
||
| 847 | 847 | * Liste et descriptions des tables auxiliaires |
| 848 | 848 | **/ |
| 849 | 849 | function lister_tables_auxiliaires() { |
| 850 | - static $done = false; |
|
| 851 | - if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) { |
|
| 852 | - lister_tables_objets_sql(); |
|
| 853 | - $done = true; |
|
| 854 | - } |
|
| 850 | + static $done = false; |
|
| 851 | + if (!$done or !(is_countable($GLOBALS['tables_auxiliaires']) ? count($GLOBALS['tables_auxiliaires']) : 0)) { |
|
| 852 | + lister_tables_objets_sql(); |
|
| 853 | + $done = true; |
|
| 854 | + } |
|
| 855 | 855 | |
| 856 | - return $GLOBALS['tables_auxiliaires']; |
|
| 856 | + return $GLOBALS['tables_auxiliaires']; |
|
| 857 | 857 | } |
| 858 | 858 | |
| 859 | 859 | /** |
@@ -862,45 +862,45 @@ discard block |
||
| 862 | 862 | * @return array |
| 863 | 863 | */ |
| 864 | 864 | function lister_tables_objets_surnoms() { |
| 865 | - static $surnoms = null; |
|
| 866 | - static $md5 = null; |
|
| 867 | - if ( |
|
| 868 | - !$surnoms |
|
| 869 | - or $md5 != lister_tables_objets_sql('::md5') |
|
| 870 | - ) { |
|
| 871 | - // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions |
|
| 872 | - // pour compatibilite, car il faut dorenavent utiliser |
|
| 873 | - // declarer_table_objets_sql |
|
| 874 | - $surnoms = pipeline( |
|
| 875 | - 'declarer_tables_objets_surnoms', |
|
| 876 | - [ |
|
| 877 | - # pour les modeles |
|
| 878 | - # a enlever ? |
|
| 879 | - 'doc' => 'documents', |
|
| 880 | - 'img' => 'documents', |
|
| 881 | - 'emb' => 'documents', |
|
| 882 | - ] |
|
| 883 | - ); |
|
| 884 | - $infos_tables = lister_tables_objets_sql(); |
|
| 885 | - foreach ($infos_tables as $t => $infos) { |
|
| 886 | - // cas de base type=>table |
|
| 887 | - // et preg_replace(',^spip_|^id_|s$,',table)=>table |
|
| 888 | - if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide |
|
| 889 | - // optimisations pour table_objet |
|
| 890 | - //$surnoms[$infos['type']] = $infos['table_objet']; |
|
| 891 | - $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet']; |
|
| 892 | - $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet']; |
|
| 893 | - if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) { |
|
| 894 | - foreach ($infos['table_objet_surnoms'] as $surnom) { |
|
| 895 | - $surnoms[$surnom] = $infos['table_objet']; |
|
| 896 | - } |
|
| 897 | - } |
|
| 898 | - } |
|
| 899 | - } |
|
| 900 | - $md5 = lister_tables_objets_sql('::md5'); |
|
| 901 | - } |
|
| 902 | - |
|
| 903 | - return $surnoms; |
|
| 865 | + static $surnoms = null; |
|
| 866 | + static $md5 = null; |
|
| 867 | + if ( |
|
| 868 | + !$surnoms |
|
| 869 | + or $md5 != lister_tables_objets_sql('::md5') |
|
| 870 | + ) { |
|
| 871 | + // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions |
|
| 872 | + // pour compatibilite, car il faut dorenavent utiliser |
|
| 873 | + // declarer_table_objets_sql |
|
| 874 | + $surnoms = pipeline( |
|
| 875 | + 'declarer_tables_objets_surnoms', |
|
| 876 | + [ |
|
| 877 | + # pour les modeles |
|
| 878 | + # a enlever ? |
|
| 879 | + 'doc' => 'documents', |
|
| 880 | + 'img' => 'documents', |
|
| 881 | + 'emb' => 'documents', |
|
| 882 | + ] |
|
| 883 | + ); |
|
| 884 | + $infos_tables = lister_tables_objets_sql(); |
|
| 885 | + foreach ($infos_tables as $t => $infos) { |
|
| 886 | + // cas de base type=>table |
|
| 887 | + // et preg_replace(',^spip_|^id_|s$,',table)=>table |
|
| 888 | + if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide |
|
| 889 | + // optimisations pour table_objet |
|
| 890 | + //$surnoms[$infos['type']] = $infos['table_objet']; |
|
| 891 | + $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet']; |
|
| 892 | + $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet']; |
|
| 893 | + if (is_array($infos['table_objet_surnoms']) and count($infos['table_objet_surnoms'])) { |
|
| 894 | + foreach ($infos['table_objet_surnoms'] as $surnom) { |
|
| 895 | + $surnoms[$surnom] = $infos['table_objet']; |
|
| 896 | + } |
|
| 897 | + } |
|
| 898 | + } |
|
| 899 | + } |
|
| 900 | + $md5 = lister_tables_objets_sql('::md5'); |
|
| 901 | + } |
|
| 902 | + |
|
| 903 | + return $surnoms; |
|
| 904 | 904 | } |
| 905 | 905 | |
| 906 | 906 | /** |
@@ -909,35 +909,35 @@ discard block |
||
| 909 | 909 | * @return array |
| 910 | 910 | */ |
| 911 | 911 | function lister_types_surnoms() { |
| 912 | - static $surnoms = null; |
|
| 913 | - static $md5 = null; |
|
| 914 | - if ( |
|
| 915 | - !$surnoms |
|
| 916 | - or $md5 != lister_tables_objets_sql('::md5') |
|
| 917 | - ) { |
|
| 918 | - // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions |
|
| 919 | - // pour compatibilite, car il faut dorenavent utiliser |
|
| 920 | - // declarer_table_objets_sql |
|
| 921 | - $surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']); |
|
| 922 | - $infos_tables = lister_tables_objets_sql(); |
|
| 923 | - foreach ($infos_tables as $t => $infos) { |
|
| 924 | - if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide |
|
| 925 | - // optimisations pour objet_type |
|
| 926 | - //$surnoms[$infos['type']] = $infos['type']; |
|
| 927 | - $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type']; |
|
| 928 | - $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type']; |
|
| 929 | - // surnoms declares |
|
| 930 | - if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) { |
|
| 931 | - foreach ($infos['type_surnoms'] as $surnom) { |
|
| 932 | - $surnoms[$surnom] = $infos['type']; |
|
| 933 | - } |
|
| 934 | - } |
|
| 935 | - } |
|
| 936 | - } |
|
| 937 | - $md5 = lister_tables_objets_sql('::md5'); |
|
| 938 | - } |
|
| 939 | - |
|
| 940 | - return $surnoms; |
|
| 912 | + static $surnoms = null; |
|
| 913 | + static $md5 = null; |
|
| 914 | + if ( |
|
| 915 | + !$surnoms |
|
| 916 | + or $md5 != lister_tables_objets_sql('::md5') |
|
| 917 | + ) { |
|
| 918 | + // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions |
|
| 919 | + // pour compatibilite, car il faut dorenavent utiliser |
|
| 920 | + // declarer_table_objets_sql |
|
| 921 | + $surnoms = pipeline('declarer_type_surnoms', ['racine-site' => 'site']); |
|
| 922 | + $infos_tables = lister_tables_objets_sql(); |
|
| 923 | + foreach ($infos_tables as $t => $infos) { |
|
| 924 | + if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide |
|
| 925 | + // optimisations pour objet_type |
|
| 926 | + //$surnoms[$infos['type']] = $infos['type']; |
|
| 927 | + $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type']; |
|
| 928 | + $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type']; |
|
| 929 | + // surnoms declares |
|
| 930 | + if (is_array($infos['type_surnoms']) and count($infos['type_surnoms'])) { |
|
| 931 | + foreach ($infos['type_surnoms'] as $surnom) { |
|
| 932 | + $surnoms[$surnom] = $infos['type']; |
|
| 933 | + } |
|
| 934 | + } |
|
| 935 | + } |
|
| 936 | + } |
|
| 937 | + $md5 = lister_tables_objets_sql('::md5'); |
|
| 938 | + } |
|
| 939 | + |
|
| 940 | + return $surnoms; |
|
| 941 | 941 | } |
| 942 | 942 | |
| 943 | 943 | /** |
@@ -951,22 +951,22 @@ discard block |
||
| 951 | 951 | * Couples (nom de la table SQL => même nom, sans 'spip_' devant) |
| 952 | 952 | **/ |
| 953 | 953 | function lister_tables_spip($serveur = '') { |
| 954 | - static $tables = []; |
|
| 955 | - if (!isset($tables[$serveur])) { |
|
| 956 | - $tables[$serveur] = []; |
|
| 957 | - if (!function_exists('sql_alltable')) { |
|
| 958 | - include_spip('base/abstract_sql'); |
|
| 959 | - } |
|
| 960 | - $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso) |
|
| 961 | - $connexion = $GLOBALS['connexions'][$serveur ?: 0]; |
|
| 962 | - $spip = $connexion['prefixe'] . '_'; |
|
| 963 | - foreach ($ts as $t) { |
|
| 964 | - $t = substr($t, strlen($spip)); |
|
| 965 | - $tables[$serveur]["spip_$t"] = $t; |
|
| 966 | - } |
|
| 967 | - } |
|
| 968 | - |
|
| 969 | - return $tables[$serveur]; |
|
| 954 | + static $tables = []; |
|
| 955 | + if (!isset($tables[$serveur])) { |
|
| 956 | + $tables[$serveur] = []; |
|
| 957 | + if (!function_exists('sql_alltable')) { |
|
| 958 | + include_spip('base/abstract_sql'); |
|
| 959 | + } |
|
| 960 | + $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso) |
|
| 961 | + $connexion = $GLOBALS['connexions'][$serveur ?: 0]; |
|
| 962 | + $spip = $connexion['prefixe'] . '_'; |
|
| 963 | + foreach ($ts as $t) { |
|
| 964 | + $t = substr($t, strlen($spip)); |
|
| 965 | + $tables[$serveur]["spip_$t"] = $t; |
|
| 966 | + } |
|
| 967 | + } |
|
| 968 | + |
|
| 969 | + return $tables[$serveur]; |
|
| 970 | 970 | } |
| 971 | 971 | |
| 972 | 972 | |
@@ -981,18 +981,18 @@ discard block |
||
| 981 | 981 | * Couples (nom de la table SQL => même nom) |
| 982 | 982 | **/ |
| 983 | 983 | function lister_toutes_tables($serveur) { |
| 984 | - static $tables = []; |
|
| 985 | - if (!isset($tables[$serveur])) { |
|
| 986 | - $tables[$serveur] = []; |
|
| 987 | - if (!function_exists('sql_alltable')) { |
|
| 988 | - include_spip('base/abstract_sql'); |
|
| 989 | - } |
|
| 990 | - $ts = sql_alltable('%', $serveur); // toutes les tables |
|
| 991 | - foreach ($ts as $t) { |
|
| 992 | - $tables[$serveur][$t] = $t; |
|
| 993 | - } |
|
| 994 | - } |
|
| 995 | - return $tables[$serveur]; |
|
| 984 | + static $tables = []; |
|
| 985 | + if (!isset($tables[$serveur])) { |
|
| 986 | + $tables[$serveur] = []; |
|
| 987 | + if (!function_exists('sql_alltable')) { |
|
| 988 | + include_spip('base/abstract_sql'); |
|
| 989 | + } |
|
| 990 | + $ts = sql_alltable('%', $serveur); // toutes les tables |
|
| 991 | + foreach ($ts as $t) { |
|
| 992 | + $tables[$serveur][$t] = $t; |
|
| 993 | + } |
|
| 994 | + } |
|
| 995 | + return $tables[$serveur]; |
|
| 996 | 996 | } |
| 997 | 997 | |
| 998 | 998 | /** |
@@ -1013,39 +1013,39 @@ discard block |
||
| 1013 | 1013 | **/ |
| 1014 | 1014 | function table_objet(string $type, string $serveur = ''): string { |
| 1015 | 1015 | |
| 1016 | - if ($type) { |
|
| 1017 | - $type = preg_replace(',^spip_|^id_|s$,', '', $type); |
|
| 1018 | - } |
|
| 1019 | - if (!strlen($type)) { |
|
| 1020 | - return ''; |
|
| 1021 | - } |
|
| 1022 | - |
|
| 1023 | - $surnoms = lister_tables_objets_surnoms(); |
|
| 1024 | - if (isset($surnoms[$type])) { |
|
| 1025 | - return $surnoms[$type]; |
|
| 1026 | - } |
|
| 1027 | - |
|
| 1028 | - if ($serveur !== false) { |
|
| 1029 | - $t = lister_tables_spip($serveur); |
|
| 1030 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1031 | - $typetrim = rtrim($type, 's') . 's'; |
|
| 1032 | - if ( |
|
| 1033 | - (isset($t[$typetrim]) or in_array($typetrim, $t)) |
|
| 1034 | - and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur)) |
|
| 1035 | - ) { |
|
| 1036 | - return $desc['id_table']; |
|
| 1037 | - } elseif ( |
|
| 1038 | - (isset($t[$type]) or in_array($type, $t)) |
|
| 1039 | - and ($desc = $trouver_table($type, $serveur)) |
|
| 1040 | - ) { |
|
| 1041 | - return $desc['id_table']; |
|
| 1042 | - } |
|
| 1043 | - |
|
| 1044 | - spip_log('table_objet(' . $type . ') calculee sans verification'); |
|
| 1045 | - #spip_log(debug_backtrace(),'db'); |
|
| 1046 | - } |
|
| 1047 | - |
|
| 1048 | - return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false |
|
| 1016 | + if ($type) { |
|
| 1017 | + $type = preg_replace(',^spip_|^id_|s$,', '', $type); |
|
| 1018 | + } |
|
| 1019 | + if (!strlen($type)) { |
|
| 1020 | + return ''; |
|
| 1021 | + } |
|
| 1022 | + |
|
| 1023 | + $surnoms = lister_tables_objets_surnoms(); |
|
| 1024 | + if (isset($surnoms[$type])) { |
|
| 1025 | + return $surnoms[$type]; |
|
| 1026 | + } |
|
| 1027 | + |
|
| 1028 | + if ($serveur !== false) { |
|
| 1029 | + $t = lister_tables_spip($serveur); |
|
| 1030 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1031 | + $typetrim = rtrim($type, 's') . 's'; |
|
| 1032 | + if ( |
|
| 1033 | + (isset($t[$typetrim]) or in_array($typetrim, $t)) |
|
| 1034 | + and ($desc = $trouver_table(rtrim($type, 's') . 's', $serveur)) |
|
| 1035 | + ) { |
|
| 1036 | + return $desc['id_table']; |
|
| 1037 | + } elseif ( |
|
| 1038 | + (isset($t[$type]) or in_array($type, $t)) |
|
| 1039 | + and ($desc = $trouver_table($type, $serveur)) |
|
| 1040 | + ) { |
|
| 1041 | + return $desc['id_table']; |
|
| 1042 | + } |
|
| 1043 | + |
|
| 1044 | + spip_log('table_objet(' . $type . ') calculee sans verification'); |
|
| 1045 | + #spip_log(debug_backtrace(),'db'); |
|
| 1046 | + } |
|
| 1047 | + |
|
| 1048 | + return rtrim($type, 's') . 's'; # cas historique ne devant plus servir, sauf si $serveur=false |
|
| 1049 | 1049 | } |
| 1050 | 1050 | |
| 1051 | 1051 | /** |
@@ -1066,33 +1066,33 @@ discard block |
||
| 1066 | 1066 | **/ |
| 1067 | 1067 | function table_objet_sql(string $type, string $serveur = ''): string { |
| 1068 | 1068 | |
| 1069 | - $nom = table_objet($type, $serveur); |
|
| 1070 | - if (!strlen($nom)) { |
|
| 1071 | - return ''; |
|
| 1072 | - } |
|
| 1073 | - if (!isset($GLOBALS['table_des_tables']['articles'])) { |
|
| 1074 | - // eviter de multiples inclusions |
|
| 1075 | - include_spip('public/interfaces'); |
|
| 1076 | - } |
|
| 1077 | - if (isset($GLOBALS['table_des_tables'][$nom])) { |
|
| 1078 | - $nom = $GLOBALS['table_des_tables'][$nom]; |
|
| 1079 | - $nom = "spip_$nom"; |
|
| 1080 | - } else { |
|
| 1081 | - $infos_tables = lister_tables_objets_sql(); |
|
| 1082 | - if (isset($infos_tables["spip_$nom"])) { |
|
| 1083 | - $nom = "spip_$nom"; |
|
| 1084 | - } elseif ($serveur !== false) { |
|
| 1085 | - $t = lister_tables_spip($serveur); |
|
| 1086 | - if (isset($t[$nom]) or in_array($nom, $t)) { |
|
| 1087 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1088 | - if ($desc = $trouver_table($nom, $serveur)) { |
|
| 1089 | - return $desc['table_sql']; |
|
| 1090 | - } |
|
| 1091 | - } |
|
| 1092 | - } |
|
| 1093 | - } |
|
| 1094 | - |
|
| 1095 | - return $nom; |
|
| 1069 | + $nom = table_objet($type, $serveur); |
|
| 1070 | + if (!strlen($nom)) { |
|
| 1071 | + return ''; |
|
| 1072 | + } |
|
| 1073 | + if (!isset($GLOBALS['table_des_tables']['articles'])) { |
|
| 1074 | + // eviter de multiples inclusions |
|
| 1075 | + include_spip('public/interfaces'); |
|
| 1076 | + } |
|
| 1077 | + if (isset($GLOBALS['table_des_tables'][$nom])) { |
|
| 1078 | + $nom = $GLOBALS['table_des_tables'][$nom]; |
|
| 1079 | + $nom = "spip_$nom"; |
|
| 1080 | + } else { |
|
| 1081 | + $infos_tables = lister_tables_objets_sql(); |
|
| 1082 | + if (isset($infos_tables["spip_$nom"])) { |
|
| 1083 | + $nom = "spip_$nom"; |
|
| 1084 | + } elseif ($serveur !== false) { |
|
| 1085 | + $t = lister_tables_spip($serveur); |
|
| 1086 | + if (isset($t[$nom]) or in_array($nom, $t)) { |
|
| 1087 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1088 | + if ($desc = $trouver_table($nom, $serveur)) { |
|
| 1089 | + return $desc['table_sql']; |
|
| 1090 | + } |
|
| 1091 | + } |
|
| 1092 | + } |
|
| 1093 | + } |
|
| 1094 | + |
|
| 1095 | + return $nom; |
|
| 1096 | 1096 | } |
| 1097 | 1097 | |
| 1098 | 1098 | /** |
@@ -1111,35 +1111,35 @@ discard block |
||
| 1111 | 1111 | * Nom de la clé primaire |
| 1112 | 1112 | **/ |
| 1113 | 1113 | function id_table_objet(string $type, string $serveur = ''): ?string { |
| 1114 | - static $trouver_table = null; |
|
| 1115 | - $type = objet_type($type, $serveur); |
|
| 1116 | - if (!$type) { |
|
| 1117 | - return null; |
|
| 1118 | - } |
|
| 1119 | - $t = table_objet($type); |
|
| 1120 | - if (!$trouver_table) { |
|
| 1121 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1122 | - } |
|
| 1123 | - |
|
| 1124 | - $ts = lister_tables_spip($serveur); |
|
| 1125 | - if ( |
|
| 1126 | - in_array($t, $ts) |
|
| 1127 | - or in_array($t, lister_toutes_tables($serveur)) |
|
| 1128 | - ) { |
|
| 1129 | - $desc = $trouver_table($t, $serveur); |
|
| 1130 | - if (isset($desc['key']['PRIMARY KEY'])) { |
|
| 1131 | - return $desc['key']['PRIMARY KEY']; |
|
| 1132 | - } |
|
| 1133 | - if (!$desc or isset($desc['field']["id_$type"])) { |
|
| 1134 | - return "id_$type"; |
|
| 1135 | - } |
|
| 1136 | - // sinon renvoyer le premier champ de la table... |
|
| 1137 | - $keys = array_keys($desc['field']); |
|
| 1138 | - |
|
| 1139 | - return array_shift($keys); |
|
| 1140 | - } |
|
| 1141 | - |
|
| 1142 | - return "id_$type"; |
|
| 1114 | + static $trouver_table = null; |
|
| 1115 | + $type = objet_type($type, $serveur); |
|
| 1116 | + if (!$type) { |
|
| 1117 | + return null; |
|
| 1118 | + } |
|
| 1119 | + $t = table_objet($type); |
|
| 1120 | + if (!$trouver_table) { |
|
| 1121 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1122 | + } |
|
| 1123 | + |
|
| 1124 | + $ts = lister_tables_spip($serveur); |
|
| 1125 | + if ( |
|
| 1126 | + in_array($t, $ts) |
|
| 1127 | + or in_array($t, lister_toutes_tables($serveur)) |
|
| 1128 | + ) { |
|
| 1129 | + $desc = $trouver_table($t, $serveur); |
|
| 1130 | + if (isset($desc['key']['PRIMARY KEY'])) { |
|
| 1131 | + return $desc['key']['PRIMARY KEY']; |
|
| 1132 | + } |
|
| 1133 | + if (!$desc or isset($desc['field']["id_$type"])) { |
|
| 1134 | + return "id_$type"; |
|
| 1135 | + } |
|
| 1136 | + // sinon renvoyer le premier champ de la table... |
|
| 1137 | + $keys = array_keys($desc['field']); |
|
| 1138 | + |
|
| 1139 | + return array_shift($keys); |
|
| 1140 | + } |
|
| 1141 | + |
|
| 1142 | + return "id_$type"; |
|
| 1143 | 1143 | } |
| 1144 | 1144 | |
| 1145 | 1145 | /** |
@@ -1158,60 +1158,60 @@ discard block |
||
| 1158 | 1158 | * Type de l'objet |
| 1159 | 1159 | **/ |
| 1160 | 1160 | function objet_type(string $table_objet, string $serveur = ''): ?string { |
| 1161 | - if (!$table_objet) { |
|
| 1162 | - return null; |
|
| 1163 | - } |
|
| 1164 | - $surnoms = lister_types_surnoms(); |
|
| 1165 | - |
|
| 1166 | - // scenario de base |
|
| 1167 | - // le type est decline a partir du nom de la table en enlevant le prefixe eventuel |
|
| 1168 | - // et la marque du pluriel |
|
| 1169 | - // on accepte id_xx en entree aussi |
|
| 1170 | - $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet); |
|
| 1171 | - if (isset($surnoms[$type])) { |
|
| 1172 | - return $surnoms[$type]; |
|
| 1173 | - } |
|
| 1174 | - |
|
| 1175 | - // securite : eliminer les caracteres non \w |
|
| 1176 | - $type = preg_replace(',[^\w-],', '', $type); |
|
| 1177 | - |
|
| 1178 | - // si le type redonne bien la table c'est bon |
|
| 1179 | - // oui si table_objet ressemblait deja a un type |
|
| 1180 | - if ( |
|
| 1181 | - $type == $table_objet |
|
| 1182 | - or (table_objet($type, $serveur) == $table_objet) |
|
| 1183 | - or (table_objet_sql($type, $serveur) == $table_objet) |
|
| 1184 | - ) { |
|
| 1185 | - return $type; |
|
| 1186 | - } |
|
| 1187 | - |
|
| 1188 | - // si on ne veut pas chercher en base |
|
| 1189 | - if ($serveur === false) { |
|
| 1190 | - return $type; |
|
| 1191 | - } |
|
| 1192 | - |
|
| 1193 | - // sinon on passe par la cle primaire id_xx pour trouver le type |
|
| 1194 | - // car le s a la fin est incertain |
|
| 1195 | - // notamment en cas de pluriel derogatoire |
|
| 1196 | - // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux |
|
| 1197 | - // une declaration jeu => jeux, journal => journaux |
|
| 1198 | - // dans le pipeline declarer_tables_objets_surnoms |
|
| 1199 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1200 | - $ts = lister_tables_spip($serveur); |
|
| 1201 | - $desc = false; |
|
| 1202 | - if (in_array($table_objet, $ts)) { |
|
| 1203 | - $desc = $trouver_table($table_objet); |
|
| 1204 | - } |
|
| 1205 | - if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) { |
|
| 1206 | - $desc = $trouver_table($table_objet, $serveur); |
|
| 1207 | - } |
|
| 1208 | - // si le type est declare : bingo ! |
|
| 1209 | - if ($desc and isset($desc['type'])) { |
|
| 1210 | - return $desc['type']; |
|
| 1211 | - } |
|
| 1212 | - |
|
| 1213 | - // on a fait ce qu'on a pu |
|
| 1214 | - return $type; |
|
| 1161 | + if (!$table_objet) { |
|
| 1162 | + return null; |
|
| 1163 | + } |
|
| 1164 | + $surnoms = lister_types_surnoms(); |
|
| 1165 | + |
|
| 1166 | + // scenario de base |
|
| 1167 | + // le type est decline a partir du nom de la table en enlevant le prefixe eventuel |
|
| 1168 | + // et la marque du pluriel |
|
| 1169 | + // on accepte id_xx en entree aussi |
|
| 1170 | + $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet); |
|
| 1171 | + if (isset($surnoms[$type])) { |
|
| 1172 | + return $surnoms[$type]; |
|
| 1173 | + } |
|
| 1174 | + |
|
| 1175 | + // securite : eliminer les caracteres non \w |
|
| 1176 | + $type = preg_replace(',[^\w-],', '', $type); |
|
| 1177 | + |
|
| 1178 | + // si le type redonne bien la table c'est bon |
|
| 1179 | + // oui si table_objet ressemblait deja a un type |
|
| 1180 | + if ( |
|
| 1181 | + $type == $table_objet |
|
| 1182 | + or (table_objet($type, $serveur) == $table_objet) |
|
| 1183 | + or (table_objet_sql($type, $serveur) == $table_objet) |
|
| 1184 | + ) { |
|
| 1185 | + return $type; |
|
| 1186 | + } |
|
| 1187 | + |
|
| 1188 | + // si on ne veut pas chercher en base |
|
| 1189 | + if ($serveur === false) { |
|
| 1190 | + return $type; |
|
| 1191 | + } |
|
| 1192 | + |
|
| 1193 | + // sinon on passe par la cle primaire id_xx pour trouver le type |
|
| 1194 | + // car le s a la fin est incertain |
|
| 1195 | + // notamment en cas de pluriel derogatoire |
|
| 1196 | + // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux |
|
| 1197 | + // une declaration jeu => jeux, journal => journaux |
|
| 1198 | + // dans le pipeline declarer_tables_objets_surnoms |
|
| 1199 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1200 | + $ts = lister_tables_spip($serveur); |
|
| 1201 | + $desc = false; |
|
| 1202 | + if (in_array($table_objet, $ts)) { |
|
| 1203 | + $desc = $trouver_table($table_objet); |
|
| 1204 | + } |
|
| 1205 | + if (!$desc and in_array($table_objet = table_objet($type, $serveur), $ts)) { |
|
| 1206 | + $desc = $trouver_table($table_objet, $serveur); |
|
| 1207 | + } |
|
| 1208 | + // si le type est declare : bingo ! |
|
| 1209 | + if ($desc and isset($desc['type'])) { |
|
| 1210 | + return $desc['type']; |
|
| 1211 | + } |
|
| 1212 | + |
|
| 1213 | + // on a fait ce qu'on a pu |
|
| 1214 | + return $type; |
|
| 1215 | 1215 | } |
| 1216 | 1216 | |
| 1217 | 1217 | /** |
@@ -1227,62 +1227,62 @@ discard block |
||
| 1227 | 1227 | * @return bool |
| 1228 | 1228 | */ |
| 1229 | 1229 | function objet_test_si_publie($objet, $id_objet, $serveur = '') { |
| 1230 | - // voir si une fonction est definie pour faire le boulot |
|
| 1231 | - // elle a la priorite dans ce cas |
|
| 1232 | - if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) { |
|
| 1233 | - return $f($objet, $id_objet, $serveur); |
|
| 1234 | - } |
|
| 1235 | - |
|
| 1236 | - // sinon on se fie a la declaration de l'objet si presente |
|
| 1237 | - $id_table = $table_objet = table_objet($objet); |
|
| 1238 | - $id_table_objet = id_table_objet($objet, $serveur); |
|
| 1239 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1240 | - if ( |
|
| 1241 | - $desc = $trouver_table($table_objet, $serveur) |
|
| 1242 | - and isset($desc['statut']) |
|
| 1243 | - and $desc['statut'] |
|
| 1244 | - ) { |
|
| 1245 | - $boucle = new Boucle(); |
|
| 1246 | - $boucle->show = $desc; |
|
| 1247 | - $boucle->nom = 'objet_test_si_publie'; |
|
| 1248 | - $boucle->id_boucle = $id_table; |
|
| 1249 | - $boucle->id_table = $id_table; |
|
| 1250 | - $boucle->primary = $desc['key']['PRIMARY KEY'] ?? ''; |
|
| 1251 | - $boucle->sql_serveur = $serveur; |
|
| 1252 | - $boucle->select[] = $id_table_objet; |
|
| 1253 | - $boucle->from[$table_objet] = table_objet_sql($objet, $serveur); |
|
| 1254 | - $boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet); |
|
| 1255 | - |
|
| 1256 | - $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php |
|
| 1257 | - $boucle->descr['sourcefile'] = 'internal'; |
|
| 1258 | - $boucle->descr['gram'] = 'html'; |
|
| 1259 | - |
|
| 1260 | - include_spip('public/compiler'); |
|
| 1261 | - include_spip('public/composer'); |
|
| 1262 | - instituer_boucle($boucle, false, true); |
|
| 1263 | - $res = calculer_select( |
|
| 1264 | - $boucle->select, |
|
| 1265 | - $boucle->from, |
|
| 1266 | - $boucle->from_type, |
|
| 1267 | - $boucle->where, |
|
| 1268 | - $boucle->join, |
|
| 1269 | - $boucle->group, |
|
| 1270 | - $boucle->order, |
|
| 1271 | - $boucle->limit, |
|
| 1272 | - $boucle->having, |
|
| 1273 | - $table_objet, |
|
| 1274 | - $id_table, |
|
| 1275 | - $serveur |
|
| 1276 | - ); |
|
| 1277 | - if (sql_fetch($res)) { |
|
| 1278 | - return true; |
|
| 1279 | - } |
|
| 1280 | - |
|
| 1281 | - return false; |
|
| 1282 | - } |
|
| 1283 | - |
|
| 1284 | - // si pas d'info statut ni de fonction : l'objet est publie |
|
| 1285 | - return true; |
|
| 1230 | + // voir si une fonction est definie pour faire le boulot |
|
| 1231 | + // elle a la priorite dans ce cas |
|
| 1232 | + if ($f = charger_fonction($objet . '_test_si_publie', 'base', true)) { |
|
| 1233 | + return $f($objet, $id_objet, $serveur); |
|
| 1234 | + } |
|
| 1235 | + |
|
| 1236 | + // sinon on se fie a la declaration de l'objet si presente |
|
| 1237 | + $id_table = $table_objet = table_objet($objet); |
|
| 1238 | + $id_table_objet = id_table_objet($objet, $serveur); |
|
| 1239 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 1240 | + if ( |
|
| 1241 | + $desc = $trouver_table($table_objet, $serveur) |
|
| 1242 | + and isset($desc['statut']) |
|
| 1243 | + and $desc['statut'] |
|
| 1244 | + ) { |
|
| 1245 | + $boucle = new Boucle(); |
|
| 1246 | + $boucle->show = $desc; |
|
| 1247 | + $boucle->nom = 'objet_test_si_publie'; |
|
| 1248 | + $boucle->id_boucle = $id_table; |
|
| 1249 | + $boucle->id_table = $id_table; |
|
| 1250 | + $boucle->primary = $desc['key']['PRIMARY KEY'] ?? ''; |
|
| 1251 | + $boucle->sql_serveur = $serveur; |
|
| 1252 | + $boucle->select[] = $id_table_objet; |
|
| 1253 | + $boucle->from[$table_objet] = table_objet_sql($objet, $serveur); |
|
| 1254 | + $boucle->where[] = $id_table . '.' . $id_table_objet . '=' . intval($id_objet); |
|
| 1255 | + |
|
| 1256 | + $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php |
|
| 1257 | + $boucle->descr['sourcefile'] = 'internal'; |
|
| 1258 | + $boucle->descr['gram'] = 'html'; |
|
| 1259 | + |
|
| 1260 | + include_spip('public/compiler'); |
|
| 1261 | + include_spip('public/composer'); |
|
| 1262 | + instituer_boucle($boucle, false, true); |
|
| 1263 | + $res = calculer_select( |
|
| 1264 | + $boucle->select, |
|
| 1265 | + $boucle->from, |
|
| 1266 | + $boucle->from_type, |
|
| 1267 | + $boucle->where, |
|
| 1268 | + $boucle->join, |
|
| 1269 | + $boucle->group, |
|
| 1270 | + $boucle->order, |
|
| 1271 | + $boucle->limit, |
|
| 1272 | + $boucle->having, |
|
| 1273 | + $table_objet, |
|
| 1274 | + $id_table, |
|
| 1275 | + $serveur |
|
| 1276 | + ); |
|
| 1277 | + if (sql_fetch($res)) { |
|
| 1278 | + return true; |
|
| 1279 | + } |
|
| 1280 | + |
|
| 1281 | + return false; |
|
| 1282 | + } |
|
| 1283 | + |
|
| 1284 | + // si pas d'info statut ni de fonction : l'objet est publie |
|
| 1285 | + return true; |
|
| 1286 | 1286 | } |
| 1287 | 1287 | |
| 1288 | 1288 | |
@@ -1317,124 +1317,124 @@ discard block |
||
| 1317 | 1317 | * Retourne un tableau décrivant les parents trouvés |
| 1318 | 1318 | */ |
| 1319 | 1319 | function objet_lister_parents($objet, $id_objet, $parent_direct_seulement = false) { |
| 1320 | - $parents = []; |
|
| 1321 | - |
|
| 1322 | - // Si on trouve une ou des méthodes de parent |
|
| 1323 | - if ($parent_methodes = objet_type_decrire_infos_parents($objet)) { |
|
| 1324 | - // On identifie les informations sur l'objet source dont on cherche le parent. |
|
| 1325 | - include_spip('base/abstract_sql'); |
|
| 1326 | - $table_objet = table_objet_sql($objet); |
|
| 1327 | - $cle_objet = id_table_objet($objet); |
|
| 1328 | - $id_objet = intval($id_objet); |
|
| 1329 | - |
|
| 1330 | - // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête |
|
| 1331 | - foreach ($parent_methodes as $parent_methode) { |
|
| 1332 | - // Champ identifiant le parent (id et éventuellement le type) |
|
| 1333 | - // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente |
|
| 1334 | - // de celle de l'objet source |
|
| 1335 | - $select = []; |
|
| 1336 | - if (isset($parent_methode['champ'])) { |
|
| 1337 | - $select[] = $parent_methode['champ']; |
|
| 1338 | - } |
|
| 1339 | - if (isset($parent_methode['champ_type'])) { |
|
| 1340 | - $select[] = $parent_methode['champ_type']; |
|
| 1341 | - } |
|
| 1342 | - |
|
| 1343 | - // Détermination de la table du parent et des conditions sur l'objet source et le parent. |
|
| 1344 | - $condition_objet_invalide = false; |
|
| 1345 | - $where = []; |
|
| 1346 | - if (!isset($parent_methode['table'])) { |
|
| 1347 | - // Le parent est stocké dans la même table que l'objet source : |
|
| 1348 | - // -- toutes les conditions s'appliquent à la table source. |
|
| 1349 | - $table = $table_objet; |
|
| 1350 | - $where = ["$cle_objet = $id_objet"]; |
|
| 1351 | - // -- Condition supplémentaire sur la détection du parent |
|
| 1352 | - if (isset($parent_methode['condition'])) { |
|
| 1353 | - $where[] = $parent_methode['condition']; |
|
| 1354 | - } |
|
| 1355 | - } elseif (!$parent_direct_seulement) { |
|
| 1356 | - // Le parent est stocké dans une table différente de l'objet source. |
|
| 1357 | - // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée |
|
| 1358 | - // Si non, on peut arrêter le traitement. |
|
| 1359 | - if (isset($parent_methode['condition'])) { |
|
| 1360 | - $where = [ |
|
| 1361 | - "$cle_objet = $id_objet", |
|
| 1362 | - $parent_methode['condition'] |
|
| 1363 | - ]; |
|
| 1364 | - if (!sql_countsel($table_objet, $where)) { |
|
| 1365 | - $condition_objet_invalide = true; |
|
| 1366 | - } |
|
| 1367 | - } |
|
| 1368 | - |
|
| 1369 | - // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire |
|
| 1370 | - // la requête sur la table qui accueille le parent. |
|
| 1371 | - if (!$condition_objet_invalide) { |
|
| 1372 | - $table = $parent_methode['table']; |
|
| 1373 | - // On construit les conditions en fonction de l'identification de l'objet source |
|
| 1374 | - $where = []; |
|
| 1375 | - // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est |
|
| 1376 | - // le même que celui de l'objet source. |
|
| 1377 | - $where[] = isset($parent_methode['source_champ']) |
|
| 1378 | - ? "{$parent_methode['source_champ']} = $id_objet" |
|
| 1379 | - : "${cle_objet} = $id_objet"; |
|
| 1380 | - if (isset($parent_methode['source_champ_type'])) { |
|
| 1381 | - $where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet); |
|
| 1382 | - } |
|
| 1383 | - // -- Condition supplémentaire sur la détection du parent |
|
| 1384 | - if (isset($parent_methode['table_condition'])) { |
|
| 1385 | - $where[] = $parent_methode['table_condition']; |
|
| 1386 | - } |
|
| 1387 | - } |
|
| 1388 | - } |
|
| 1389 | - |
|
| 1390 | - // On lance la requête de récupération du parent |
|
| 1391 | - $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens'); |
|
| 1392 | - if ( |
|
| 1393 | - !$condition_objet_invalide |
|
| 1394 | - and $where |
|
| 1395 | - and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where)) |
|
| 1396 | - ) { |
|
| 1397 | - foreach ($lignes as $ligne) { |
|
| 1398 | - // Si le type est fixe |
|
| 1399 | - if (isset($parent_methode['type'])) { |
|
| 1400 | - $parent = [ |
|
| 1401 | - 'objet' => $parent_methode['type'], |
|
| 1402 | - 'id_objet' => intval($ligne[$parent_methode['champ']]), |
|
| 1403 | - 'champ' => $parent_methode['champ'], |
|
| 1404 | - 'table' => $table, |
|
| 1405 | - ]; |
|
| 1406 | - } |
|
| 1407 | - elseif (isset($parent_methode['champ_type'])) { |
|
| 1408 | - $parent = [ |
|
| 1409 | - 'objet' => $ligne[$parent_methode['champ_type']], |
|
| 1410 | - 'id_objet' => intval($ligne[$parent_methode['champ']]), |
|
| 1411 | - 'champ' => $parent_methode['champ'], |
|
| 1412 | - 'champ_type' => $parent_methode['champ_type'], |
|
| 1413 | - 'table' => $table, |
|
| 1414 | - ]; |
|
| 1415 | - } |
|
| 1416 | - if ($is_table_lien) { |
|
| 1417 | - $parent['lien'] = $ligne; |
|
| 1418 | - } |
|
| 1419 | - $parents[] = $parent; |
|
| 1420 | - } |
|
| 1421 | - } |
|
| 1422 | - } |
|
| 1423 | - } |
|
| 1424 | - |
|
| 1425 | - // On passe par un pipeline avant de retourner |
|
| 1426 | - $parents = pipeline( |
|
| 1427 | - 'objet_lister_parents', |
|
| 1428 | - [ |
|
| 1429 | - 'args' => [ |
|
| 1430 | - 'objet' => $objet, |
|
| 1431 | - 'id_objet' => $id_objet, |
|
| 1432 | - ], |
|
| 1433 | - 'data' => $parents, |
|
| 1434 | - ] |
|
| 1435 | - ); |
|
| 1436 | - |
|
| 1437 | - return $parents; |
|
| 1320 | + $parents = []; |
|
| 1321 | + |
|
| 1322 | + // Si on trouve une ou des méthodes de parent |
|
| 1323 | + if ($parent_methodes = objet_type_decrire_infos_parents($objet)) { |
|
| 1324 | + // On identifie les informations sur l'objet source dont on cherche le parent. |
|
| 1325 | + include_spip('base/abstract_sql'); |
|
| 1326 | + $table_objet = table_objet_sql($objet); |
|
| 1327 | + $cle_objet = id_table_objet($objet); |
|
| 1328 | + $id_objet = intval($id_objet); |
|
| 1329 | + |
|
| 1330 | + // On teste chacun méthode dans l'ordre, et dès qu'on a trouvé un parent on s'arrête |
|
| 1331 | + foreach ($parent_methodes as $parent_methode) { |
|
| 1332 | + // Champ identifiant le parent (id et éventuellement le type) |
|
| 1333 | + // -- cette identification ne dépend pas du fait que le parent soit stocké dans une table de différente |
|
| 1334 | + // de celle de l'objet source |
|
| 1335 | + $select = []; |
|
| 1336 | + if (isset($parent_methode['champ'])) { |
|
| 1337 | + $select[] = $parent_methode['champ']; |
|
| 1338 | + } |
|
| 1339 | + if (isset($parent_methode['champ_type'])) { |
|
| 1340 | + $select[] = $parent_methode['champ_type']; |
|
| 1341 | + } |
|
| 1342 | + |
|
| 1343 | + // Détermination de la table du parent et des conditions sur l'objet source et le parent. |
|
| 1344 | + $condition_objet_invalide = false; |
|
| 1345 | + $where = []; |
|
| 1346 | + if (!isset($parent_methode['table'])) { |
|
| 1347 | + // Le parent est stocké dans la même table que l'objet source : |
|
| 1348 | + // -- toutes les conditions s'appliquent à la table source. |
|
| 1349 | + $table = $table_objet; |
|
| 1350 | + $where = ["$cle_objet = $id_objet"]; |
|
| 1351 | + // -- Condition supplémentaire sur la détection du parent |
|
| 1352 | + if (isset($parent_methode['condition'])) { |
|
| 1353 | + $where[] = $parent_methode['condition']; |
|
| 1354 | + } |
|
| 1355 | + } elseif (!$parent_direct_seulement) { |
|
| 1356 | + // Le parent est stocké dans une table différente de l'objet source. |
|
| 1357 | + // -- on vérifie d'emblée si il y a une condition sur l'objet source et si celle-ci est vérifiée |
|
| 1358 | + // Si non, on peut arrêter le traitement. |
|
| 1359 | + if (isset($parent_methode['condition'])) { |
|
| 1360 | + $where = [ |
|
| 1361 | + "$cle_objet = $id_objet", |
|
| 1362 | + $parent_methode['condition'] |
|
| 1363 | + ]; |
|
| 1364 | + if (!sql_countsel($table_objet, $where)) { |
|
| 1365 | + $condition_objet_invalide = true; |
|
| 1366 | + } |
|
| 1367 | + } |
|
| 1368 | + |
|
| 1369 | + // Si pas de condition sur l'objet source ou que la condition est vérifiée, on peut construire |
|
| 1370 | + // la requête sur la table qui accueille le parent. |
|
| 1371 | + if (!$condition_objet_invalide) { |
|
| 1372 | + $table = $parent_methode['table']; |
|
| 1373 | + // On construit les conditions en fonction de l'identification de l'objet source |
|
| 1374 | + $where = []; |
|
| 1375 | + // -- si le champ_source de l'id n'est pas précisé c'est qu'il est déjà connu et donc que c'est |
|
| 1376 | + // le même que celui de l'objet source. |
|
| 1377 | + $where[] = isset($parent_methode['source_champ']) |
|
| 1378 | + ? "{$parent_methode['source_champ']} = $id_objet" |
|
| 1379 | + : "${cle_objet} = $id_objet"; |
|
| 1380 | + if (isset($parent_methode['source_champ_type'])) { |
|
| 1381 | + $where[] = "{$parent_methode['source_champ_type']} = " . sql_quote($objet); |
|
| 1382 | + } |
|
| 1383 | + // -- Condition supplémentaire sur la détection du parent |
|
| 1384 | + if (isset($parent_methode['table_condition'])) { |
|
| 1385 | + $where[] = $parent_methode['table_condition']; |
|
| 1386 | + } |
|
| 1387 | + } |
|
| 1388 | + } |
|
| 1389 | + |
|
| 1390 | + // On lance la requête de récupération du parent |
|
| 1391 | + $is_table_lien = (strpos($table, '_liens') !== false and substr($table, -6) === '_liens'); |
|
| 1392 | + if ( |
|
| 1393 | + !$condition_objet_invalide |
|
| 1394 | + and $where |
|
| 1395 | + and ($lignes = sql_allfetsel($is_table_lien ? '*' : $select, $table, $where)) |
|
| 1396 | + ) { |
|
| 1397 | + foreach ($lignes as $ligne) { |
|
| 1398 | + // Si le type est fixe |
|
| 1399 | + if (isset($parent_methode['type'])) { |
|
| 1400 | + $parent = [ |
|
| 1401 | + 'objet' => $parent_methode['type'], |
|
| 1402 | + 'id_objet' => intval($ligne[$parent_methode['champ']]), |
|
| 1403 | + 'champ' => $parent_methode['champ'], |
|
| 1404 | + 'table' => $table, |
|
| 1405 | + ]; |
|
| 1406 | + } |
|
| 1407 | + elseif (isset($parent_methode['champ_type'])) { |
|
| 1408 | + $parent = [ |
|
| 1409 | + 'objet' => $ligne[$parent_methode['champ_type']], |
|
| 1410 | + 'id_objet' => intval($ligne[$parent_methode['champ']]), |
|
| 1411 | + 'champ' => $parent_methode['champ'], |
|
| 1412 | + 'champ_type' => $parent_methode['champ_type'], |
|
| 1413 | + 'table' => $table, |
|
| 1414 | + ]; |
|
| 1415 | + } |
|
| 1416 | + if ($is_table_lien) { |
|
| 1417 | + $parent['lien'] = $ligne; |
|
| 1418 | + } |
|
| 1419 | + $parents[] = $parent; |
|
| 1420 | + } |
|
| 1421 | + } |
|
| 1422 | + } |
|
| 1423 | + } |
|
| 1424 | + |
|
| 1425 | + // On passe par un pipeline avant de retourner |
|
| 1426 | + $parents = pipeline( |
|
| 1427 | + 'objet_lister_parents', |
|
| 1428 | + [ |
|
| 1429 | + 'args' => [ |
|
| 1430 | + 'objet' => $objet, |
|
| 1431 | + 'id_objet' => $id_objet, |
|
| 1432 | + ], |
|
| 1433 | + 'data' => $parents, |
|
| 1434 | + ] |
|
| 1435 | + ); |
|
| 1436 | + |
|
| 1437 | + return $parents; |
|
| 1438 | 1438 | } |
| 1439 | 1439 | |
| 1440 | 1440 | /** |
@@ -1446,17 +1446,17 @@ discard block |
||
| 1446 | 1446 | * @return array |
| 1447 | 1447 | */ |
| 1448 | 1448 | function objet_lister_parents_par_type($objet, $id_objet) { |
| 1449 | - $parents = objet_lister_parents($objet, $id_objet); |
|
| 1449 | + $parents = objet_lister_parents($objet, $id_objet); |
|
| 1450 | 1450 | |
| 1451 | - $parents_par_type = []; |
|
| 1452 | - foreach ($parents as $parent) { |
|
| 1453 | - if (!isset($parents_par_type[$parent['objet']])) { |
|
| 1454 | - $parents_par_type[$parent['objet']] = []; |
|
| 1455 | - } |
|
| 1456 | - $parents_par_type[$parent['objet']][] = $parent['id_objet']; |
|
| 1457 | - } |
|
| 1451 | + $parents_par_type = []; |
|
| 1452 | + foreach ($parents as $parent) { |
|
| 1453 | + if (!isset($parents_par_type[$parent['objet']])) { |
|
| 1454 | + $parents_par_type[$parent['objet']] = []; |
|
| 1455 | + } |
|
| 1456 | + $parents_par_type[$parent['objet']][] = $parent['id_objet']; |
|
| 1457 | + } |
|
| 1458 | 1458 | |
| 1459 | - return $parents_par_type; |
|
| 1459 | + return $parents_par_type; |
|
| 1460 | 1460 | } |
| 1461 | 1461 | |
| 1462 | 1462 | |
@@ -1489,85 +1489,85 @@ discard block |
||
| 1489 | 1489 | * Retourne un tableau de tableaux, avec comme clés les types des objets, et dans chacun un tableau des identifiants trouvés |
| 1490 | 1490 | */ |
| 1491 | 1491 | function objet_lister_enfants($objet, $id_objet) { |
| 1492 | - $enfants = []; |
|
| 1493 | - |
|
| 1494 | - // Si on trouve des types d'enfants et leurs méthodes |
|
| 1495 | - if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) { |
|
| 1496 | - include_spip('base/abstract_sql'); |
|
| 1497 | - $id_objet = intval($id_objet); |
|
| 1498 | - |
|
| 1499 | - // On parcourt tous les types d'enfants trouvés |
|
| 1500 | - foreach ($enfants_methodes as $objet_enfant => $_methode_parent) { |
|
| 1501 | - // On construit les conditions d'identification du parent |
|
| 1502 | - $where = []; |
|
| 1503 | - // -- L'identifiant du parent |
|
| 1504 | - if (isset($_methode_parent['champ'])) { |
|
| 1505 | - $where[] = $_methode_parent['champ'] . ' = ' . $id_objet; |
|
| 1506 | - } |
|
| 1507 | - // -- Si le parent est variable |
|
| 1508 | - if (isset($_methode_parent['champ_type'])) { |
|
| 1509 | - $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet); |
|
| 1510 | - } |
|
| 1511 | - |
|
| 1512 | - // On détermine la table, le champ id des enfants et on complète éventuellement les conditions |
|
| 1513 | - if (!isset($_methode_parent['table'])) { |
|
| 1514 | - // Les enfants sont stockés dans la même table que l'objet parent : |
|
| 1515 | - $table_enfant = table_objet_sql($objet_enfant); |
|
| 1516 | - $cle_objet_enfant = id_table_objet($objet_enfant); |
|
| 1517 | - |
|
| 1518 | - // S'il y a une condition supplémentaire |
|
| 1519 | - if (isset($_methode_parent['condition'])) { |
|
| 1520 | - $where[] = $_methode_parent['condition']; |
|
| 1521 | - } |
|
| 1522 | - } else { |
|
| 1523 | - // Les enfants sont stockés dans une table différente de l'objet parent. |
|
| 1524 | - $table_enfant = $_methode_parent['table']; |
|
| 1525 | - $cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant); |
|
| 1526 | - |
|
| 1527 | - // S'il y a une condition supplémentaire |
|
| 1528 | - if (isset($_methode_parent['table_condition'])) { |
|
| 1529 | - $where[] = $_methode_parent['table_condition']; |
|
| 1530 | - } |
|
| 1531 | - } |
|
| 1532 | - |
|
| 1533 | - // On lance la requête |
|
| 1534 | - $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens'); |
|
| 1535 | - if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) { |
|
| 1536 | - $enfant = [ |
|
| 1537 | - 'objet' => $objet_enfant, |
|
| 1538 | - 'id_objet' => 0, |
|
| 1539 | - 'table' => $table_enfant |
|
| 1540 | - ]; |
|
| 1541 | - if (isset($_methode_parent['champ'])) { |
|
| 1542 | - $enfant['champ'] = $_methode_parent['champ']; |
|
| 1543 | - } |
|
| 1544 | - if (isset($_methode_parent['champ_type'])) { |
|
| 1545 | - $enfant['champ_type'] = $_methode_parent['champ_type']; |
|
| 1546 | - } |
|
| 1547 | - foreach ($rows as $row) { |
|
| 1548 | - $enfant['id_objet'] = intval($row[$cle_objet_enfant]); |
|
| 1549 | - if ($is_table_lien) { |
|
| 1550 | - $enfant['lien'] = $row; |
|
| 1551 | - } |
|
| 1552 | - $enfants[] = $enfant; |
|
| 1553 | - } |
|
| 1554 | - } |
|
| 1555 | - } |
|
| 1556 | - } |
|
| 1557 | - |
|
| 1558 | - // On passe par un pipeline avant de retourner |
|
| 1559 | - $enfants = pipeline( |
|
| 1560 | - 'objet_lister_enfants', |
|
| 1561 | - [ |
|
| 1562 | - 'args' => [ |
|
| 1563 | - 'objet' => $objet, |
|
| 1564 | - 'id_objet' => $id_objet, |
|
| 1565 | - ], |
|
| 1566 | - 'data' => $enfants, |
|
| 1567 | - ] |
|
| 1568 | - ); |
|
| 1569 | - |
|
| 1570 | - return $enfants; |
|
| 1492 | + $enfants = []; |
|
| 1493 | + |
|
| 1494 | + // Si on trouve des types d'enfants et leurs méthodes |
|
| 1495 | + if ($enfants_methodes = objet_type_decrire_infos_enfants($objet)) { |
|
| 1496 | + include_spip('base/abstract_sql'); |
|
| 1497 | + $id_objet = intval($id_objet); |
|
| 1498 | + |
|
| 1499 | + // On parcourt tous les types d'enfants trouvés |
|
| 1500 | + foreach ($enfants_methodes as $objet_enfant => $_methode_parent) { |
|
| 1501 | + // On construit les conditions d'identification du parent |
|
| 1502 | + $where = []; |
|
| 1503 | + // -- L'identifiant du parent |
|
| 1504 | + if (isset($_methode_parent['champ'])) { |
|
| 1505 | + $where[] = $_methode_parent['champ'] . ' = ' . $id_objet; |
|
| 1506 | + } |
|
| 1507 | + // -- Si le parent est variable |
|
| 1508 | + if (isset($_methode_parent['champ_type'])) { |
|
| 1509 | + $where[] = $_methode_parent['champ_type'] . ' = ' . sql_quote($objet); |
|
| 1510 | + } |
|
| 1511 | + |
|
| 1512 | + // On détermine la table, le champ id des enfants et on complète éventuellement les conditions |
|
| 1513 | + if (!isset($_methode_parent['table'])) { |
|
| 1514 | + // Les enfants sont stockés dans la même table que l'objet parent : |
|
| 1515 | + $table_enfant = table_objet_sql($objet_enfant); |
|
| 1516 | + $cle_objet_enfant = id_table_objet($objet_enfant); |
|
| 1517 | + |
|
| 1518 | + // S'il y a une condition supplémentaire |
|
| 1519 | + if (isset($_methode_parent['condition'])) { |
|
| 1520 | + $where[] = $_methode_parent['condition']; |
|
| 1521 | + } |
|
| 1522 | + } else { |
|
| 1523 | + // Les enfants sont stockés dans une table différente de l'objet parent. |
|
| 1524 | + $table_enfant = $_methode_parent['table']; |
|
| 1525 | + $cle_objet_enfant = $_methode_parent['source_champ'] ?? id_table_objet($objet_enfant); |
|
| 1526 | + |
|
| 1527 | + // S'il y a une condition supplémentaire |
|
| 1528 | + if (isset($_methode_parent['table_condition'])) { |
|
| 1529 | + $where[] = $_methode_parent['table_condition']; |
|
| 1530 | + } |
|
| 1531 | + } |
|
| 1532 | + |
|
| 1533 | + // On lance la requête |
|
| 1534 | + $is_table_lien = (strpos($table_enfant, '_liens') !== false and substr($table_enfant, -6) === '_liens'); |
|
| 1535 | + if ($rows = sql_allfetsel($is_table_lien ? '*' : $cle_objet_enfant, $table_enfant, $where)) { |
|
| 1536 | + $enfant = [ |
|
| 1537 | + 'objet' => $objet_enfant, |
|
| 1538 | + 'id_objet' => 0, |
|
| 1539 | + 'table' => $table_enfant |
|
| 1540 | + ]; |
|
| 1541 | + if (isset($_methode_parent['champ'])) { |
|
| 1542 | + $enfant['champ'] = $_methode_parent['champ']; |
|
| 1543 | + } |
|
| 1544 | + if (isset($_methode_parent['champ_type'])) { |
|
| 1545 | + $enfant['champ_type'] = $_methode_parent['champ_type']; |
|
| 1546 | + } |
|
| 1547 | + foreach ($rows as $row) { |
|
| 1548 | + $enfant['id_objet'] = intval($row[$cle_objet_enfant]); |
|
| 1549 | + if ($is_table_lien) { |
|
| 1550 | + $enfant['lien'] = $row; |
|
| 1551 | + } |
|
| 1552 | + $enfants[] = $enfant; |
|
| 1553 | + } |
|
| 1554 | + } |
|
| 1555 | + } |
|
| 1556 | + } |
|
| 1557 | + |
|
| 1558 | + // On passe par un pipeline avant de retourner |
|
| 1559 | + $enfants = pipeline( |
|
| 1560 | + 'objet_lister_enfants', |
|
| 1561 | + [ |
|
| 1562 | + 'args' => [ |
|
| 1563 | + 'objet' => $objet, |
|
| 1564 | + 'id_objet' => $id_objet, |
|
| 1565 | + ], |
|
| 1566 | + 'data' => $enfants, |
|
| 1567 | + ] |
|
| 1568 | + ); |
|
| 1569 | + |
|
| 1570 | + return $enfants; |
|
| 1571 | 1571 | } |
| 1572 | 1572 | |
| 1573 | 1573 | /** |
@@ -1579,17 +1579,17 @@ discard block |
||
| 1579 | 1579 | * @return array |
| 1580 | 1580 | */ |
| 1581 | 1581 | function objet_lister_enfants_par_type($objet, $id_objet) { |
| 1582 | - $enfants = objet_lister_enfants($objet, $id_objet); |
|
| 1582 | + $enfants = objet_lister_enfants($objet, $id_objet); |
|
| 1583 | 1583 | |
| 1584 | - $enfants_par_type = []; |
|
| 1585 | - foreach ($enfants as $enfant) { |
|
| 1586 | - if (!isset($enfants_par_type[$enfant['objet']])) { |
|
| 1587 | - $enfants_par_type[$enfant['objet']] = []; |
|
| 1588 | - } |
|
| 1589 | - $enfants_par_type[$enfant['objet']][] = $enfant['id_objet']; |
|
| 1590 | - } |
|
| 1584 | + $enfants_par_type = []; |
|
| 1585 | + foreach ($enfants as $enfant) { |
|
| 1586 | + if (!isset($enfants_par_type[$enfant['objet']])) { |
|
| 1587 | + $enfants_par_type[$enfant['objet']] = []; |
|
| 1588 | + } |
|
| 1589 | + $enfants_par_type[$enfant['objet']][] = $enfant['id_objet']; |
|
| 1590 | + } |
|
| 1591 | 1591 | |
| 1592 | - return $enfants_par_type; |
|
| 1592 | + return $enfants_par_type; |
|
| 1593 | 1593 | } |
| 1594 | 1594 | |
| 1595 | 1595 | /** |
@@ -1601,35 +1601,35 @@ discard block |
||
| 1601 | 1601 | * Retourne un tableau de tableau contenant les informations de type et de champ pour trouver le parent ou false sinon |
| 1602 | 1602 | */ |
| 1603 | 1603 | function objet_type_decrire_infos_parents($objet) { |
| 1604 | - static $parents = []; |
|
| 1605 | - |
|
| 1606 | - // Si on ne l'a pas encore cherché pour cet objet |
|
| 1607 | - if (!isset($parents[$objet])) { |
|
| 1608 | - $parents[$objet] = false; |
|
| 1609 | - $table = table_objet_sql($objet); |
|
| 1610 | - |
|
| 1611 | - // Si on trouve bien la description de cet objet |
|
| 1612 | - if ($infos = lister_tables_objets_sql($table)) { |
|
| 1613 | - if (isset($infos['parent']) and is_array($infos['parent'])) { |
|
| 1614 | - // S'il y a une description explicite de parent, c'est prioritaire |
|
| 1615 | - // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau |
|
| 1616 | - // de description |
|
| 1617 | - if (!isset($infos['parent'][0])) { |
|
| 1618 | - $parents[$objet] = [$infos['parent']]; |
|
| 1619 | - } else { |
|
| 1620 | - $parents[$objet] = $infos['parent']; |
|
| 1621 | - } |
|
| 1622 | - } elseif (isset($infos['field']['id_rubrique'])) { |
|
| 1623 | - // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique |
|
| 1624 | - $parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']]; |
|
| 1625 | - } elseif (isset($infos['field']['id_parent'])) { |
|
| 1626 | - // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même |
|
| 1627 | - $parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']]; |
|
| 1628 | - } |
|
| 1629 | - } |
|
| 1630 | - } |
|
| 1631 | - |
|
| 1632 | - return $parents[$objet]; |
|
| 1604 | + static $parents = []; |
|
| 1605 | + |
|
| 1606 | + // Si on ne l'a pas encore cherché pour cet objet |
|
| 1607 | + if (!isset($parents[$objet])) { |
|
| 1608 | + $parents[$objet] = false; |
|
| 1609 | + $table = table_objet_sql($objet); |
|
| 1610 | + |
|
| 1611 | + // Si on trouve bien la description de cet objet |
|
| 1612 | + if ($infos = lister_tables_objets_sql($table)) { |
|
| 1613 | + if (isset($infos['parent']) and is_array($infos['parent'])) { |
|
| 1614 | + // S'il y a une description explicite de parent, c'est prioritaire |
|
| 1615 | + // -- on traite les cas où il y a une ou plusieurs description mais on renvoie toujours un tableau |
|
| 1616 | + // de description |
|
| 1617 | + if (!isset($infos['parent'][0])) { |
|
| 1618 | + $parents[$objet] = [$infos['parent']]; |
|
| 1619 | + } else { |
|
| 1620 | + $parents[$objet] = $infos['parent']; |
|
| 1621 | + } |
|
| 1622 | + } elseif (isset($infos['field']['id_rubrique'])) { |
|
| 1623 | + // Sinon on cherche des cas courants connus magiquement, à commencer par id_rubrique |
|
| 1624 | + $parents[$objet] = [['type' => 'rubrique', 'champ' => 'id_rubrique']]; |
|
| 1625 | + } elseif (isset($infos['field']['id_parent'])) { |
|
| 1626 | + // Sinon on cherche un champ id_parent, ce qui signifie que l'objet est parent de lui-même |
|
| 1627 | + $parents[$objet] = [['type' => $objet, 'champ' => 'id_parent']]; |
|
| 1628 | + } |
|
| 1629 | + } |
|
| 1630 | + } |
|
| 1631 | + |
|
| 1632 | + return $parents[$objet]; |
|
| 1633 | 1633 | } |
| 1634 | 1634 | |
| 1635 | 1635 | /** |
@@ -1641,36 +1641,36 @@ discard block |
||
| 1641 | 1641 | * Retourne un tableau de tableaux contenant chacun les informations d'un type d'enfant |
| 1642 | 1642 | */ |
| 1643 | 1643 | function objet_type_decrire_infos_enfants($objet) { |
| 1644 | - static $enfants = []; |
|
| 1645 | - |
|
| 1646 | - // Si on a déjà fait la recherche pour ce type d'objet |
|
| 1647 | - if (!isset($enfants[$objet])) { |
|
| 1648 | - $enfants[$objet] = []; |
|
| 1649 | - $tables = lister_tables_objets_sql(); |
|
| 1650 | - |
|
| 1651 | - // On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant |
|
| 1652 | - foreach ($tables as $table => $infos) { |
|
| 1653 | - $objet_enfant = objet_type($table); |
|
| 1654 | - |
|
| 1655 | - // On ne va pas refaire les tests des différents cas, on réutilise |
|
| 1656 | - if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) { |
|
| 1657 | - // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé |
|
| 1658 | - foreach ($parent_methodes as $parent_methode) { |
|
| 1659 | - // Si la méthode qu'on teste n'exclut pas le parent demandé |
|
| 1660 | - if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) { |
|
| 1661 | - // Si le type du parent est fixe et directement l'objet demandé |
|
| 1662 | - if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) { |
|
| 1663 | - $enfants[$objet][$objet_enfant] = $parent_methode; |
|
| 1664 | - } |
|
| 1665 | - // Si le type est variable, alors l'objet demandé peut forcément être parent |
|
| 1666 | - elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) { |
|
| 1667 | - $enfants[$objet][$objet_enfant] = $parent_methode; |
|
| 1668 | - } |
|
| 1669 | - } |
|
| 1670 | - } |
|
| 1671 | - } |
|
| 1672 | - } |
|
| 1673 | - } |
|
| 1674 | - |
|
| 1675 | - return $enfants[$objet]; |
|
| 1644 | + static $enfants = []; |
|
| 1645 | + |
|
| 1646 | + // Si on a déjà fait la recherche pour ce type d'objet |
|
| 1647 | + if (!isset($enfants[$objet])) { |
|
| 1648 | + $enfants[$objet] = []; |
|
| 1649 | + $tables = lister_tables_objets_sql(); |
|
| 1650 | + |
|
| 1651 | + // On parcourt toutes les tables d'objet, et on cherche si chacune peut être enfant |
|
| 1652 | + foreach ($tables as $table => $infos) { |
|
| 1653 | + $objet_enfant = objet_type($table); |
|
| 1654 | + |
|
| 1655 | + // On ne va pas refaire les tests des différents cas, on réutilise |
|
| 1656 | + if ($parent_methodes = objet_type_decrire_infos_parents($objet_enfant)) { |
|
| 1657 | + // On parcourt les différents cas possible, si certains peuvent concerner l'objet demandé |
|
| 1658 | + foreach ($parent_methodes as $parent_methode) { |
|
| 1659 | + // Si la méthode qu'on teste n'exclut pas le parent demandé |
|
| 1660 | + if (!isset($parent_methode['exclus']) or !in_array($objet, $parent_methode['exclus'])) { |
|
| 1661 | + // Si le type du parent est fixe et directement l'objet demandé |
|
| 1662 | + if (isset($parent_methode['type']) and isset($parent_methode['champ']) and $parent_methode['type'] == $objet) { |
|
| 1663 | + $enfants[$objet][$objet_enfant] = $parent_methode; |
|
| 1664 | + } |
|
| 1665 | + // Si le type est variable, alors l'objet demandé peut forcément être parent |
|
| 1666 | + elseif (isset($parent_methode['champ_type']) and isset($parent_methode['champ'])) { |
|
| 1667 | + $enfants[$objet][$objet_enfant] = $parent_methode; |
|
| 1668 | + } |
|
| 1669 | + } |
|
| 1670 | + } |
|
| 1671 | + } |
|
| 1672 | + } |
|
| 1673 | + } |
|
| 1674 | + |
|
| 1675 | + return $enfants[$objet]; |
|
| 1676 | 1676 | } |