From 20450bf84e3778787d1cc6bad61b20edc38696ba Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 9 Dec 2010 11:26:05 +0000 Subject: [PATCH] trouve_modele reprend son role initial limite au cas de modeles/ et on delegue a trouver_fond la tache de trouver un fond dans le chemin en prenant en compte son extension. Elle s'enrichit d'un argument optionnel booleen permettant de retourner son resultat sous forme de tableau type pathinfo dont la valeur 'extension' est toujours renseignee (meme en cas d'echec), et dont la valeur 'fond' contient le nom du fichier sans l'extension. Cela permet d'eviter de mettre l'extension en dur dans styliser. Les plugins pourront utiliser cette fonction, et continuer a etre compatible avec les anciennes versions de SPIP simplement en la definissant si elle n'existe pas --- ecrire/balise/formulaire_.php | 2 +- ecrire/inc/utils.php | 47 ++++++++++++++++++++++++++------ ecrire/public/styliser.php | 13 ++++----- ecrire/public/styliser_par_z.php | 21 ++++++++------ 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/ecrire/balise/formulaire_.php b/ecrire/balise/formulaire_.php index 023ac20ab1..4219a6603c 100644 --- a/ecrire/balise/formulaire_.php +++ b/ecrire/balise/formulaire_.php @@ -35,7 +35,7 @@ function existe_formulaire($form) if (!$form) return ''; // on ne sait pas, le nom du formulaire n'est pas fourni ici - return trouve_modele($form, 'formulaires/') ? $form : false; + return trouver_fond($form, 'formulaires/') ? $form : false; } diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index b2d423ec72..9aea6cab08 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -1826,22 +1826,51 @@ function recuperer_fond($fond, $contexte=array(), $options = array(), $connect=' return $options['trim'] ? ltrim($texte) : $texte; } -// Trouve un squelette, par defaut dans le repertoire modeles/ -// Attention, si le 2arg fourni, il doit avoir le / final -function trouve_modele($nom, $dir='modeles/') -{ - return find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir); +/** + * Trouve un squelette dans le repertoire modeles/ + * + * @param $nom + * @return string + */ +function trouve_modele($nom) { + return trouver_fond($nom,'modeles/'); +} + +/** + * Trouver un squelette dans le chemin + * on peut specifier un sous-dossier dans $dir + * si $pathinfo est a true, retourne un tableau avec + * les composantes du fichier trouve + * + le chemin complet sans son extension dans fond + * + * @param string $nom + * @param string $dir + * @param bool $pathinfo + * @return array|string + */ +function trouver_fond($nom, $dir='', $pathinfo = false) { + $f = find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir?rtrim($dir,'/').'/':''); + if (!$pathinfo) return $f; + // renvoyer un tableau detaille si $pathinfo==true + $p = pathinfo($f); + if (!$p['extension']) + $p['extension'] = _EXTENSION_SQUELETTES; + if (!$p['filename']) + $p['filename'] = ($p['basename']?substr($p['basename'],0,-strlen($p['extension'])-1):''); + $p['fond'] = ($f?substr($f,0,-strlen($p['extension'])-1):''); + return $p; } function tester_url_ecrire($nom){ // tester si c'est une page en squelette - if (trouve_modele($nom, 'prive/squelettes/contenu/')) + if (trouver_fond($nom, 'prive/squelettes/contenu/')) return 'fond'; // compat skels orthogonaux version precedente - elseif (trouve_modele($nom, 'prive/exec/')) + elseif (trouver_fond($nom, 'prive/exec/')) return 'fond_monobloc'; - // attention, il ne faut pas inclure l'exec ici car sinon on modifie l'environnement - // par un simple #URL_ECRIRE dans un squelette (cas d'un define en debut d'exec/nom ) + // attention, il ne faut pas inclure l'exec ici + // car sinon #URL_ECRIRE provoque des inclusions + // et des define intrusifs potentiels return (find_in_path("{$nom}.php",'exec/') OR charger_fonction($nom,'exec',true))?$nom:''; } diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php index 459f5bd282..9ed6b6d5ac 100644 --- a/ecrire/public/styliser.php +++ b/ecrire/public/styliser.php @@ -42,13 +42,10 @@ function public_styliser_dist($fond, $contexte, $lang='', $connect='') { // trouver un squelette du nom demande // ne rien dire si on ne trouve pas, // c'est l'appelant qui sait comment gerer la situation - $squelette = trouve_modele($fond,""); - - // supprimer l'extension pour pouvoir affiner par id_rubrique ou par langue - if ($squelette AND preg_match('/^(.*)[.](\w+)$/', $squelette, $r)) { - list(, $squelette, $ext) = $r; - } else $ext = 'html'; // valeur par defaut, historique. - + // ou les plugins qui feront mieux dans le pipeline + $squelette = trouver_fond($fond,"",true); + $ext = $squelette['extension']; + $flux = array( 'args' => array( 'id_rubrique' => $id_rubrique, @@ -58,7 +55,7 @@ function public_styliser_dist($fond, $contexte, $lang='', $connect='') { 'contexte' => $contexte, // le style d'un objet peut dependre de lui meme 'connect' => $connect ), - 'data' => $squelette, + 'data' => $squelette['fond'], ); if (test_espace_prive() OR defined('_ZPIP')) { diff --git a/ecrire/public/styliser_par_z.php b/ecrire/public/styliser_par_z.php index 3b2c93bbdf..30df398aeb 100644 --- a/ecrire/public/styliser_par_z.php +++ b/ecrire/public/styliser_par_z.php @@ -83,8 +83,10 @@ function public_styliser_par_z_dist($flux){ if (!isset($disponible[$fond])) $disponible[$fond] = z_contenu_disponible($prefix_path,$z_contenu,$fond,$ext); - if ($disponible[$fond]) - $flux['data'] = substr(find_in_path($prefix_path."page.$ext"), 0, - strlen(".$ext")); + if ($disponible[$fond]) { + $flux['data'] = trouver_fond("page",$prefix_path,true); + $flux['data'] = $flux['data']['fond']; + } } // echaffaudage : @@ -142,8 +144,9 @@ function public_styliser_par_z_dist($flux){ AND $dir = explode('/',$dir) AND $dir = reset($dir) AND in_array($dir,$z_blocs) - AND $f=find_in_path($prefix_path.$fond."-".$flux['args']['contexte']['composition'].".$ext")){ - $flux['data'] = substr($f,0,-strlen(".$ext")); + AND $f=trouver_fond($fond."-".$flux['args']['contexte']['composition'],$prefix_path,true) + AND $f['fond']){ + $flux['data'] = $f['fond']; } } return $flux; @@ -194,10 +197,12 @@ function z_contenu_disponible($prefix_path,$z_contenu,$type,$ext){ * @return string */ function z_trouver_bloc($prefix_path,$bloc,$fond,$ext){ - if ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") - OR $f = find_in_path("$prefix_path$bloc/$fond.$ext")) - return substr($f, 0, - strlen(".$ext")); - return ""; + $f = trouver_fond("$bloc.$fond","$prefix_path$bloc/",true); + if ($f['fond']) return $f['fond']; + + $f = trouver_fond($fond,"$prefix_path$bloc/",true); + // vide si rien trouve + return $f['fond']; } /** * Tester si un type est echaffaudable -- GitLab