X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fconfig.php;fp=www%2Fecrire%2Finc%2Fconfig.php;h=c8438989b2070c85d0290af6404d7df3603633ad;hb=a33c2ba9d919664b3bb0f565f8e9a8b9d8530cdb;hp=0000000000000000000000000000000000000000;hpb=8945248b3d948385798d9aa355c70e7089aca2b3;p=lhc%2Fweb%2Fclavette_www.git diff --git a/www/ecrire/inc/config.php b/www/ecrire/inc/config.php new file mode 100644 index 0000000..c843898 --- /dev/null +++ b/www/ecrire/inc/config.php @@ -0,0 +1,500 @@ +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; +} + +?>