X-Git-Url: https://git.cyclocoop.org/%28%28?a=blobdiff_plain;f=www%2Fplugins%2Fauto%2Fspip-bonux%2Fconfigurer%2Fpipelines.php;fp=www%2Fplugins%2Fauto%2Fspip-bonux%2Fconfigurer%2Fpipelines.php;h=7060d2558502228b3a80797c654612e6f6f440c6;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hp=0000000000000000000000000000000000000000;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c;p=velocampus%2Fweb%2Fwww.git diff --git a/www/plugins/auto/spip-bonux/configurer/pipelines.php b/www/plugins/auto/spip-bonux/configurer/pipelines.php new file mode 100644 index 0000000..7060d25 --- /dev/null +++ b/www/plugins/auto/spip-bonux/configurer/pipelines.php @@ -0,0 +1,314 @@ +"; + } + } + 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'); +?>