"; } } return $flux; } /** * Proposer un traitement par defaut pour les #FORMULAIRE_CONFIGURER_XXX * * @param array $flux * @return array */ function spip_bonux_formulaire_traiter($flux){ if ($form = $flux['args']['form'] AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction charger() ) { // charger les valeurs // ce qui permet de prendre en charge une fonction charger() existante // qui prend alors la main sur l'auto detection if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true)) $valeurs = call_user_func_array($charger_valeurs,$flux['args']['args']); $valeurs = pipeline( 'formulaire_charger', array( 'args'=>array('form'=>$form,'args'=>$flux['args']['args'],'je_suis_poste'=>false), 'data'=>$valeurs) ); // ne pas stocker editable ! unset($valeurs['editable']); // recuperer les valeurs postees $store = array(); foreach($valeurs as $k=>$v){ if (substr($k,0,1)!=='_') $store[$k] = _request($k); } $trace = spip_bonux_configurer_stocker($form,$valeurs,$store); $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true); } return $flux; } /** * Retrouver les champs d'un formulaire en parcourant son squelette * et en extrayant les balises input, textarea, select * * @param string $form * @return array */ function spip_bonux_formulaires_configurer_recense($form){ $valeurs = array(); // traiter d'abord le cas fichier yaml de description // TODO // sinon cas analyse du squelette if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') AND lire_fichier($f, $contenu)) { for ($i=0;$i<2;$i++) { // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees // permet de trouver aussi les name="#GET{truc}" if ($i==1) $contenu = recuperer_fond("formulaires/$form",array_merge($valeurs,array('editable'=>' '))); $balises = array_merge(extraire_balises($contenu,'input'), extraire_balises($contenu,'textarea'), extraire_balises($contenu,'select')); foreach($balises as $b) { if ($n = extraire_attribut($b, 'name') AND preg_match(",^([\w\-]+)(\[\w*\])*$,",$n,$r) AND !in_array($n,array('formulaire_action','formulaire_action_args')) AND extraire_attribut($b,'type')!=='submit') { $valeurs[$r[1]] = ''; // recuperer les valeurs _meta_xx qui peuvent etre fournies // en input hidden dans le squelette if (strncmp($r[1],'_meta_',6)==0) $valeurs[$r[1]] = extraire_attribut($b,'value'); } } } } spip_bonux_configurer_lire_meta($form,$valeurs); return $valeurs; } /** * Definir la regle de conteneur, en fonction de la presence * des * _meta_table : nom de la table meta ou stocker (par defaut 'meta') * _meta_casier : nom du casier dans lequel serializer (par defaut xx de formulaire_configurer_xx) * _meta_prefixe : prefixer les meta (alternative au casier) dans la table des meta (par defaur rien) * * @param string $form * @param array $valeurs */ function spip_bonux_definir_configurer_conteneur($form,$valeurs) { // stocker en base // par defaut, dans un casier serialize dans spip_meta (idem CFG) $casier = substr($form,11); $table = 'meta'; $prefixe = ''; // si on indique juste une table, il faut vider les autres proprietes // car par defaut on utilise ni casier ni prefixe dans ce cas if (isset($valeurs['_meta_table'])) { $table = $valeurs['_meta_table']; $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:''); $prefixe = (isset($valeurs['_meta_prefixe'])?$valeurs['_meta_prefixe']:''); } else { if(isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier']; if(isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe']; } return array($table,$casier,$prefixe); } /** * Stocker les metas * @param $form * @param $valeurs * @param $store */ function spip_bonux_configurer_stocker($form,$valeurs,$store) { $trace = ''; list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs); // stocker en base // par defaut, dans un casier serialize dans spip_meta (idem CFG) if (!isset($GLOBALS[$table])) lire_metas($table); // le casier peut etre de la forme casierprincipal/sous/casier // on ecrit donc au bon endroit sans perdre les autres sous casier freres if ($casier) { $c = explode('/',$casier); $casier_principal = array_shift($c); $st = isset($GLOBALS[$table][$casier_principal])?$GLOBALS[$table][$casier_principal]:array(); if (is_string($st) AND (count($c) OR is_array($store))) { $st = unserialize($st); if ($st===false) $st=array(); } $sc = &$st; while (count($c) AND $cc=reset($c)) { // creer l'entree si elle n'existe pas if (!isset($sc[$cc])) $sc[$cc] = array(); $sc = &$sc[$cc]; array_shift($c); } if (is_array($sc) AND count($sc)) $sc = array_merge($sc,$store); else $sc = $store; $store = array($casier_principal => serialize($st)); } $prefixe = ($prefixe?$prefixe.'_':''); foreach($store as $k=>$v){ ecrire_meta($prefixe.$k, $v, true, $table); if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ $trace .= "
table $table : ".$prefixe.$k." = $v;"; } } return $trace; } function spip_bonux_configurer_lire_meta($form,&$valeurs) { list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs); $prefixe = ($prefixe?$prefixe.'_':''); if ($casier) { $meta = spip_bonux_lire_config("/$table/$prefixe$casier"); $prefixe = ''; } else { $meta = spip_bonux_lire_config("/$table"); } foreach($valeurs as $k=>$v){ if (substr($k,0,1)!=='_') $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:''); } } /** * 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 'table'
* lire_config('montruc/sub') est l'element "sub" de cette config equivalent a lire_config('/meta/montruc/sub')
* * $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 spip_bonux_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 if ($cfg AND strpos($cfg,'/')===false){ return isset($GLOBALS['meta'][$cfg])? ((!$unserialize OR ($t=unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t) :$def; } // par defaut, sur la table des meta $table = 'meta'; $cfg = explode('/',$cfg); // si le premier argument est vide, c'est une syntaxe /table/ ou un appel vide '' if (!reset($cfg) AND count($cfg)>1) { array_shift($cfg); if (count($cfg)) $table = array_shift($cfg); if (!isset($GLOBALS[$table])) lire_metas($table); if (!isset($GLOBALS[$table])) return $def; } $r = $GLOBALS[$table]; // si on a demande #CONFIG{/meta,'',0} if (!count($cfg)) return $unserialize ? $r : serialize($r); $deserialize = false; // on ne deserialise qu'une seule fois... while($casier = array_shift($cfg)) { $r = isset($r[$casier])?$r[$casier]:null; // deserializer tant que c'est necessaire if (!$deserialize AND $r AND is_string($r) AND (count($cfg) OR $unserialize)) { $deserialize = true; $r = unserialize($r); } } if (is_null($r)) return $def; return $r; } if (!function_exists('balise_CONFIG')) { /** * #CONFIG retourne lire_config() * * Le 3eme argument permet de controler la serialisation du resultat * (mais ne sert que pour le depot 'meta') qui doit parfois deserialiser * * ex: |in_array{#CONFIG{toto,#ARRAY,1}}. * * Ceci n'affecte pas d'autres depots et |in_array{#CONFIG{toto/,#ARRAY}} sera equivalent * #CONFIG{/tablemeta/champ,defaut} lit la valeur de 'champ' dans la table des meta 'tablemeta' * * @param Object $p Arbre syntaxique du compilo * @return Object */ function balise_CONFIG($p) { if (!$arg = interprete_argument_balise(1,$p)) { $arg = "''"; } $sinon = interprete_argument_balise(2,$p); $unserialize = sinon(interprete_argument_balise(3,$p),"false"); $p->code = 'spip_bonux_lire_config(' . $arg . ',' . ($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')'; return $p; } } include_spip('inc/config'); ?>