diff --git a/formulaires/inserer_modeles.php b/formulaires/inserer_modeles.php index 5b3d9e5..60c9960 100644 --- a/formulaires/inserer_modeles.php +++ b/formulaires/inserer_modeles.php @@ -15,12 +15,7 @@ function formulaires_inserer_modeles_charger_dist($formulaire_modele, $modalbox, } } if ((!_request('formulaire_modele') && $formulaire_modele=='') || _request('annuler')) { - $modeles_dispo = inserer_modeles_lister_formulaires_modeles(); - include_spip('inc/config'); - $config_ignorer = lire_config('inserer_modeles/ignorer_modeles') ?? []; - foreach ($config_ignorer as $ignorer) { - unset($modeles_dispo[$ignorer]); - } + $modeles_dispo = inserer_modeles_lister_formulaires_modeles(true); $contexte['_liste_formulaires_modeles'] = $modeles_dispo; } else { if ($formulaire_modele != '') { diff --git a/inc/inserer_modeles.php b/inc/inserer_modeles.php index fe8843b..6055207 100644 --- a/inc/inserer_modeles.php +++ b/inc/inserer_modeles.php @@ -6,49 +6,69 @@ include_spip('inc/saisies'); /** * Lister les formulaires de modeles disponibles dans les dossiers modeles/ * les trie par ordre alphabétique de nom + * + * Par défaut retourne les modèles ignorés dans la config, + * on peut optionnellement les exclure. + * * @staticvar array $liste_formulaires_modeles + * @param bool $exclure_ignores + * pour exclure les modèles ignorés dans la config * @return array */ -function inserer_modeles_lister_formulaires_modeles() { - static $liste_formulaires_modeles = false; +function inserer_modeles_lister_formulaires_modeles(bool $exclure_ignores = false): array { + static $listes_memoire; + $hash = ($exclure_ignores ? 1 : 0); + if (isset($listes_memoire[$hash])) { + return $listes_memoire[$hash] ?: []; + } - if ($liste_formulaires_modeles === false) { - $liste_formulaires_modeles = array(); - $match = '[^-]*[.]yaml$'; - $liste = find_all_in_path('modeles/', $match); + $liste_formulaires_modeles = array(); + $match = '[^-]*[.]yaml$'; + $liste = find_all_in_path('modeles/', $match); - if (count($liste)) { - include_spip('inc/yaml'); - foreach ($liste as $formulaire => $chemin) { - $formulaire = str_replace('.yaml', '', $formulaire);// - $yaml_data = yaml_charger_inclusions(yaml_decode_file($chemin)); - if (is_array($yaml_data)) { - $liste_formulaires_modeles[$formulaire] = array( - 'nom' => $yaml_data['nom'], - 'icone_barre' => isset($yaml_data['icone_barre']) ? inserer_modeles_find_icone_barre_path($yaml_data['icone_barre']) : '' - ); - } + if (count($liste)) { + include_spip('inc/yaml'); + foreach ($liste as $formulaire => $chemin) { + $formulaire = str_replace('.yaml', '', $formulaire);// + $yaml_data = yaml_charger_inclusions(yaml_decode_file($chemin)); + if (is_array($yaml_data)) { + $liste_formulaires_modeles[$formulaire] = array( + 'nom' => $yaml_data['nom'], + 'icone_barre' => isset($yaml_data['icone_barre']) ? inserer_modeles_find_icone_barre_path($yaml_data['icone_barre']) : '' + ); } } + } - // Traduire les chaines de langues des noms - $liste_formulaires_modeles = array_map(function($valeur) { - $valeur['nom'] = _T_ou_typo($valeur['nom']); - return $valeur; - }, $liste_formulaires_modeles); + // Traduire les chaines de langues des noms + $liste_formulaires_modeles = array_map(function($valeur) { + $valeur['nom'] = _T_ou_typo($valeur['nom']); + return $valeur; + }, $liste_formulaires_modeles); - // Puis les trier par ordre alphabétique - uasort($liste_formulaires_modeles, function($valeur1, $valeur2) { - if ($valeur1['nom'] > $valeur2['nom']) { - return 1; - } elseif ($valeur1['nom'] == $valeur2['nom']) { - return 0; - } else { - return -1; - } - }); - } + // Puis les trier par ordre alphabétique + uasort($liste_formulaires_modeles, function($valeur1, $valeur2) { + if ($valeur1['nom'] > $valeur2['nom']) { + return 1; + } elseif ($valeur1['nom'] == $valeur2['nom']) { + return 0; + } else { + return -1; + } + }); + $liste_formulaires_modeles = pipeline('inserer_modeles_lister_formulaires_modeles', $liste_formulaires_modeles); + + // Retirer les modèles désactivés dans la config + if ($exclure_ignores === true) { + include_spip('inc/config'); + $config_ignorer = lire_config('inserer_modeles/ignorer_modeles') ?? []; + foreach ($config_ignorer as $ignorer) { + unset($liste_formulaires_modeles[$ignorer]); + } + } + $listes_memoire[$hash] = $liste_formulaires_modeles; + return $liste_formulaires_modeles; } diff --git a/inserer_modeles_pipelines.php b/inserer_modeles_pipelines.php index 692b026..30eb071 100644 --- a/inserer_modeles_pipelines.php +++ b/inserer_modeles_pipelines.php @@ -24,7 +24,7 @@ function inserer_modeles_affiche_droite($flux) { $objets = inserer_modeles_objets(); if (in_array($flux['args']['exec'], $objets)) { include_spip('inc/inserer_modeles'); - if (count(inserer_modeles_lister_formulaires_modeles()) > 0) { + if (count(inserer_modeles_lister_formulaires_modeles(true)) > 0) { $flux['data'] .= recuperer_fond('inserer_modeles', $flux['args']); } } @@ -36,7 +36,7 @@ function inserer_modeles_affiche_droite($flux) { function inserer_modeles_porte_plume_barre_pre_charger($barres) { include_spip('inc/inserer_modeles'); - $formulaires_modeles = inserer_modeles_lister_formulaires_modeles(); + $formulaires_modeles = inserer_modeles_lister_formulaires_modeles(true); if (count($formulaires_modeles) > 0) { $barre = &$barres['edition']; $barre->ajouterApres('grpCaracteres', array( @@ -84,7 +84,7 @@ function inserer_modeles_porte_plume_barre_pre_charger($barres) { function inserer_modeles_porte_plume_lien_classe_vers_icone($flux) { include_spip('inc/inserer_modeles'); - $formulaires_modeles = inserer_modeles_lister_formulaires_modeles(); + $formulaires_modeles = inserer_modeles_lister_formulaires_modeles(true); if (count($formulaires_modeles) > 0) { $icones = array(); $icones['outil_inserer_modeles'] = inserer_modeles_find_icone_barre_path('modele-xx.svg');