1) { array_shift($cfg); $table = array_shift($cfg); if (!isset($GLOBALS[$table])) lire_metas($table); } // si on a demande #CONFIG{/meta,'',0} if (count($cfg)) $casier = array_shift($cfg); if (count($cfg)) $sous_casier = $cfg; } return array($table,$casier,$sous_casier); } /** * Lecture de la configuration * * lire_config() permet de recuperer une config depuis le php
* memes arguments que la balise (forcement)
* $cfg: la config, lire_config('montruc') est un tableau
* lire_config('/table/champ') lit le valeur de champ dans la table des meta 'spip_table'
* lire_config('montruc/sub') est l'element "sub" de cette config equivalent a lire_config('/meta/montruc/sub')
* * lire_config('methode::montruc/sub') delegue la lecture a methode_lire_config_dist via un charger_fonction * permet de brancher CFG ou autre outil externe qui etend les methodes de stockage de config * * $unserialize est mis par l'histoire * * @param string $cfg la config * @param mixed $def un défaut optionnel * @param boolean $unserialize n'affecte que le dépôt 'meta' * @return string */ function lire_config($cfg='', $def=null, $unserialize=true) { // lire le stockage sous la forme /table/valeur // ou valeur qui est en fait implicitement /meta/valeur // ou casier/valeur qui est en fait implicitement /meta/casier/valeur // traiter en priorite le cas simple et frequent // de lecture direct $GLOBALS['meta']['truc'], si $cfg ne contient ni / ni : if ($cfg AND strpbrk($cfg,'/:')===false){ $r = isset($GLOBALS['meta'][$cfg])? ((!$unserialize // ne pas essayer de deserialiser autre chose qu'une chaine OR !is_string($GLOBALS['meta'][$cfg]) // ne pas essayer de deserialiser si ce n'est visiblement pas une chaine serializee OR strpos($GLOBALS['meta'][$cfg],':')===false OR ($t=unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t) :$def; return $r; } // Brancher sur methodes externes si besoin if ($cfg AND $p=strpos($cfg,'::')){ $methode = substr($cfg,0,$p); $lire_config = charger_fonction($methode, 'lire_config'); return $lire_config(substr($cfg,$p+2),$def,$unserialize); } list($table,$casier,$sous_casier) = expliquer_config($cfg); if (!isset($GLOBALS[$table])) return $def; $r = $GLOBALS[$table]; // si on a demande #CONFIG{/meta,'',0} if (!$casier) return $unserialize ? $r : serialize($r); // casier principal : // le deserializer si demande // ou si on a besoin // d'un sous casier $r = isset($r[$casier])?$r[$casier]:null; if (($unserialize OR count($sous_casier)) AND $r AND is_string($r)) $r = (($t=unserialize($r))===false?$r:$t); // aller chercher le sous_casier while(!is_null($r) AND $casier = array_shift($sous_casier)) $r = isset($r[$casier])?$r[$casier]:null; if (is_null($r)) return $def; return $r; } /** * metapack est inclue dans lire_config, mais on traite le cas ou il est explicite * metapack:: dans le $cfg de lire_config. * On renvoie simplement sur lire_config * * @param string $cfg * @param mixed $def * @param bool $unserialize * @return mixed */ function lire_config_metapack_dist($cfg='', $def=null, $unserialize=true) { return lire_config($cfg, $def, $unserialize); } /** * Ecrire une configuration * * @param string $cfg * @param mixed $store * @return bool */ function ecrire_config($cfg,$store) { // Brancher sur methodes externes si besoin if ($cfg AND $p=strpos($cfg,'::')){ $methode = substr($cfg,0,$p); $ecrire_config = charger_fonction($methode, 'ecrire_config'); return $ecrire_config(substr($cfg,$p+2),$store); } list($table,$casier,$sous_casier) = expliquer_config($cfg); // il faut au moins un casier pour ecrire if (!$casier) return false; // trouvons ou creons le pointeur sur le casier $st = isset($GLOBALS[$table][$casier])?$GLOBALS[$table][$casier]:null; if (!is_array($st) AND ($sous_casier OR is_array($store))) { $st = unserialize($st); if ($st===false) { // ne rien creer si c'est une demande d'effacement if (is_null($store)) return false; $st=array(); } } // si on a affaire a un sous caiser // il faut ecrire au bon endroit sans perdre les autres sous casier freres if ($c = $sous_casier) { $sc = &$st; $pointeurs = array(); while (count($c) AND $cc=array_shift($c)) { // creer l'entree si elle n'existe pas if (!isset($sc[$cc])) { // si on essaye d'effacer une config qui n'existe pas // ne rien creer mais sortir if (is_null($store)) return false; $sc[$cc] = array(); } $pointeurs[$cc] = &$sc; $sc = &$sc[$cc]; } // si c'est une demande d'effacement if (is_null($store)){ $c = $sous_casier; $sous = array_pop($c); // effacer, et remonter pour effacer les parents vides do { unset($pointeurs[$sous][$sous]); } while ($sous = array_pop($c) AND !count($pointeurs[$sous][$sous])); // si on a vide tous les sous casiers, // et que le casier est vide // vider aussi la meta if (!$sous AND !count($st)) $st = null; } // dans tous les autres cas, on ecrase else $sc = $store; // Maintenant que $st est modifiee // reprenons la comme valeur a stocker dans le casier principal $store = $st; } if (is_null($store)) { if (is_null($st) AND !$sous_casier) return false; // la config n'existait deja pas ! effacer_meta ($casier, $table); if (!count($GLOBALS[$table]) OR count($GLOBALS[$table])==1 AND isset($GLOBALS[$table]['charset'])) { effacer_meta('charset', $table); // enlevons cette meta supprimer_table_meta($table); // supprimons la table (si elle est bien vide) } } // les meta ne peuvent etre que des chaines : il faut serializer le reste else { if (!isset($GLOBALS[$table])) installer_table_meta($table); // si ce n'est pas une chaine // il faut serializer if (!is_string($store)) $store=serialize($store); ecrire_meta($casier, $store, null, $table); } // verifier que lire_config($cfg)==$store ? return true; } /** * metapack est inclue dans ecrire_config, mais on traite le cas ou il est explicite * metapack:: dans le $cfg de ecrire_config. * On renvoie simplement sur ecrire_config * * @param string $cfg * @param mixed $store * @return bool */ function ecrire_config_metapack_dist($cfg,$store) { // cas particulier en metapack:: // si on ecrit une chaine deja serializee, il faut la reserializer pour la rendre // intacte en sortie ... if (is_string($store) AND strpos($store,':') AND unserialize($store)) $store = serialize($store); return ecrire_config($cfg, $store); } /** * Effacer une configuration : revient a ecrire une valeur null * @param string $cfg * @return bool */ function effacer_config($cfg){ ecrire_config($cfg, null); return true; } function lister_configurer($exclure = array()){ return array(); // lister les pages de config deja dans les menus $deja = array(); foreach($exclure as $id=>$b) { $url = ($b['url'] ? $b['url'] : $id); if (!$b['url'] or !isset($exclure[$url])) { if (strncmp($url,'configurer_',11)==0) { $deja[$url] = $b; } elseif($b['url']=='configurer' AND preg_match(',cfg=([a-z0-9_]+),i',$b['args'],$match)) { $deja["configurer_".$match[1]] = $b; } } } $exclure = $exclure + $deja; $icone_defaut = "images/configuration-16.png"; $liste = array(); $skels = array(); $forms = array(); // trouver toutes les pages configurer_xxx de l'espace prive // et construire un tableau des entrees qui ne sont pas dans $deja $pages = find_all_in_path("prive/squelettes/contenu/", "configurer_.*[.]"._EXTENSION_SQUELETTES.'$'); foreach($pages as $page) { $configurer = basename($page,"."._EXTENSION_SQUELETTES); if (!isset($exclure[$configurer])) { $liste[$configurer] = array( 'parent' => 'bando_configuration', 'url' => $configurer, 'titre' => _T("configurer:{$configurer}_titre"), 'icone' => find_in_theme($i="images/{$configurer}-16.png")?$i:$icone_defaut, ); } $skels[$configurer] = $page; } // analyser la liste des $skels pour voir les #FORMULAIRE_CONFIGURER_ inclus foreach($skels as $file) { $forms = array_merge($forms, lister_formulaires_configurer($file)); } $forms = array_flip($forms); // trouver tous les formulaires/configurer_ // et construire un tableau des entrees $pages = find_all_in_path("formulaires/", "configurer_.*[.]"._EXTENSION_SQUELETTES.'$'); foreach($pages as $page) { $configurer = basename($page,"."._EXTENSION_SQUELETTES); if (!isset($forms[$configurer]) AND !isset($liste[$configurer]) AND !isset($exclure[$configurer])) $liste[$configurer] = array( 'parent' => 'bando_configuration', 'url' => 'configurer', 'args' => 'cfg='.substr($configurer,11), 'titre' => _T("configurer:{$configurer}_titre"), 'icone' => find_in_theme($i="images/{$configurer}-16.png")?$i:$icone_defaut, ); } return $liste; } /** * Retourne la liste des formulaires de configuration * presents dans le fichier dont l'adresse est donnee * * @param string $file adresse du fichier * @return array liste des formulaires trouves **/ function lister_formulaires_configurer($file) { $forms = array(); lire_fichier($file, $skel); if (preg_match_all(",#FORMULAIRE_(CONFIGURER_[A-Z0-9_]*),", $skel, $matches,PREG_SET_ORDER)) { $matches = array_map('end',$matches); $matches = array_map('strtolower',$matches); $forms = array_merge($forms,$matches); } // evaluer le fond en lui passant un exec coherent pour que les pipelines le reconnaissent // et reperer les formulaires CVT configurer_xx insereres par les plugins via pipeline $config = basename(substr($file,0,-strlen("."._EXTENSION_SQUELETTES))); spip_log('Calcul de '."prive/squelettes/contenu/$config"); $fond = recuperer_fond("prive/squelettes/contenu/$config", array("exec" => $config)); // passer dans le pipeline affiche_milieu pour que les plugins puissent ajouter leur formulaires... // et donc que l'on puisse les referencer aussi ! $fond = pipeline('affiche_milieu', array('args'=>array("exec" => $config),'data'=>$fond)); // recuperer les noms des formulaires presents. if (is_array($inputs = extraire_balises($fond,"input"))) { foreach($inputs as $i) { if (extraire_attribut($i,'name')=='formulaire_action') { $forms[] = ($c=extraire_attribut($i,'value')); } } } return $forms; } // http://doc.spip.org/@liste_metas function liste_metas() { return pipeline('configurer_liste_metas', array( 'nom_site' => _T('info_mon_site_spip'), 'slogan_site' => '', 'adresse_site' => preg_replace(",/$,", "", url_de_base()), 'descriptif_site' => '', 'activer_logos' => 'oui', 'activer_logos_survol' => 'non', 'articles_surtitre' => 'non', 'articles_soustitre' => 'non', 'articles_descriptif' => 'non', 'articles_chapeau' => 'non', 'articles_texte' => 'oui', 'articles_ps' => 'non', 'articles_redac' => 'non', 'post_dates' => 'non', 'articles_urlref' => 'non', 'articles_redirection' => 'non', 'creer_preview' => 'non', 'taille_preview' => 150, 'articles_modif' => 'non', 'rubriques_descriptif' => 'non', 'rubriques_texte' => 'oui', 'accepter_inscriptions' => 'non', 'accepter_visiteurs' => 'non', 'prevenir_auteurs' => 'non', 'suivi_edito' => 'non', 'adresse_suivi' =>'', 'adresse_suivi_inscription' =>'', 'adresse_neuf' => '', 'jours_neuf' => '', 'quoi_de_neuf' => 'non', 'preview' => ',0minirezo,1comite,', 'syndication_integrale' => 'oui', 'charset' => _DEFAULT_CHARSET, 'dir_img' => substr(_DIR_IMG,strlen(_DIR_RACINE)), 'multi_rubriques' => 'non', 'multi_secteurs' => 'non', 'gerer_trad' => 'non', 'langues_multilingue' => '', 'version_html_max' => 'html4', 'type_urls' => 'page', 'email_envoi' => '', 'email_webmaster' => '', 'auto_compress_http'=>'non', )); } // mets les meta a des valeurs conventionnelles quand elles sont vides // et recalcule les langues // http://doc.spip.org/@actualise_metas function actualise_metas($liste_meta) { $meta_serveur = array('version_installee','adresse_site','alea_ephemere_ancien','alea_ephemere','alea_ephemere_date','langue_site','langues_proposees','date_calcul_rubriques','derniere_modif','optimiser_table','drapeau_edition','creer_preview','taille_preview','creer_htpasswd','creer_htaccess','gd_formats_read','gd_formats', 'netpbm_formats','formats_graphiques','image_process','plugin_header','plugin'); // verifier le impt=non sql_updateq('spip_meta',array('impt'=>'non'),sql_in('nom',$meta_serveur)); while (list($nom, $valeur) = each($liste_meta)) { if (!$GLOBALS['meta'][$nom]) { ecrire_meta($nom, $valeur); } } include_spip('inc/rubriques'); $langues = calculer_langues_utilisees(); ecrire_meta('langues_utilisees', $langues); } // // Gestion des modifs // // http://doc.spip.org/@appliquer_modifs_config function appliquer_modifs_config($purger_skel=false) { foreach(liste_metas() as $i => $v) { if (($x =_request($i))!==NULL) ecrire_meta($i, $x); elseif (!isset($GLOBALS['meta'][$i])) ecrire_meta($i, $v); } if ($purger_skel) { include_spip('inc/invalideur'); purger_repertoire(_DIR_SKELS); } } /** * Mettre a jour l'adresse du site a partir d'une valeur saisie * (ou auto detection si vide) * * @param $adresse_site * @return void */ function appliquer_adresse_site($adresse_site){ if ($adresse_site!==NULL){ if (!strlen($adresse_site)) {$GLOBALS['profondeur_url']=_DIR_RESTREINT?0:1;$adresse_site = url_de_base();} $adresse_site = preg_replace(",/?\s*$,", "", $adresse_site); if (!preg_match(",^[\w]+://,Uims",$adresse_site)) $adresse_site = "http://$adresse_site"; ecrire_meta('adresse_site',$adresse_site); } return $adresse_site; } ?>