%k25u25%fgd5n!?%k25u25%fgd5n!%k25u25%fgd5n!?%k25u25%fgd5n!cfg_options.php000066600000002250151452626520007602 0ustar00 formulaires/configurer.html000066600000002214151452626520012140 0ustar00
[(#ENV{_param}|cle{titre}|oui) [

[(#CHEMIN_IMAGE{[(#ENV{_param}|cle{logo})]} |balise_img{'',cadre-icone})](#ENV{_param}|cle{titre})

] ] [

(#ENV*{message_ok})

] [

(#ENV*{message_erreur})

] [(#ENV{editable}|oui)
[(#ACTION_FORMULAIRE{#ENV{action}})]
    [(#INCLURE{fond=configurer/form_[(#ENV{id})], env})]

[(#ENV{_param}|cle{bouton_reset}|oui) ] [(#ENV{_param}|cle{bouton_supprimer}|oui) ]

]
plugin.xml000066600000004507151452626520006606 0ustar00 CFG bertrand Gugger, Matthieu Marcillaud © 2009 GNU/LGPL 1.16.0 stable [fr]Moteur de configuration [en]Configuration tool [de]Konfigurationsmodul [fr]Ce plugin permet de gérer très simplement des interfaces de configuration pour différents modules. Il est utilisé par de nombreux plugins, mais il peut aussi avoir d'autres usages comme le paramétrage de squelettes. [en]This plugin manage some configuration graphic user interfaces for some modules. [de]Dieses Plugin stellt die Konfigurationsschnittstelle für zahlreiche Plugins bereit. Es kann auch fü die Konfiguration von Skeletten verwendet werden. http://www.spip-contrib.net/?rubrique575 cfg cfg.png cfg_options.php cfg_fonctions.php ajouter_boutons cfg_pipeline.php affiche_gauche cfg_pipeline.php header_prive cfg_pipeline.php insert_head cfg_pipeline.php insert_head_css cfg_pipeline.php formulaire_charger cfg_pipeline.php formulaire_verifier cfg_pipeline.php formulaire_traiter cfg_pipeline.php editer_contenu_formulaire_cfg cfg_pipeline.php outil cfg/params/selecteur_couleur.php000066600000002433151452626520013046 0ustar00depuis_cvt) ? 'inline':'head'; // si le plugin Palette est installé, on patche if (is_dir(find_in_path(_DIR_PLUGIN_PALETTE))) { $cfg->param[$ou] .= " "; } } ?> cfg/params/rediriger.php000066600000003602151452626520011270 0ustar00messages = array_merge($cfg->messages, unserialize($messages)); } } /** * Traite une demande de redirection * * Si le fond du formulaire demande expressement une redirection * par , on stocke le message dans une meta * et on redirige le client, de maniere a charger la page * avec la nouvelle config (ce qui permet par exemple a Autorite * de controler d'eventuels conflits generes par les nouvelles autorisations) * * @param mixed $valeur # inutilisé * @param Object $cfg */ function cfg_post_traiter_param_rediriger($valeur, &$cfg){ if ($cfg->messages) { include_spip('inc/meta'); ecrire_meta('cfg_message_'.$GLOBALS['auteur_session']['id_auteur'], serialize($cfg->messages), 'non'); if (defined('_COMPAT_CFG_192')) ecrire_metas(); include_spip('inc/headers'); redirige_par_entete(parametre_url(self(),null,null,'&')); } } ?> cfg/classes/type_pwd.php000066600000001204151452626520011315 0ustar00val[$champ]) < 5){ $cfg->ajouter_erreur($champ, _T('cfg:erreur_type_pwd', array('champ'=>$champ))); } return true; } ?> cfg/classes/cfg_couleur.php000066600000001575151452626520011772 0ustar00param['selecteur_couleur'] = 1; $cfg->ajouter_extension_parametre('selecteur_couleur'); return $cfg; } ?> cfg/classes/cfg_id.php000066600000004253151452626520010704 0ustar00champs[$nom]['id'] = count($cfg->champs_id); $cfg->champs_id[] = $nom; // Cas des champs multi, si des champs (Y) // sont declares id par la classe cfg_id, // // on les ajoute dans le chemin pour retrouver les donnees // #CONFIG{.../y1/y2/y3/...} // if (_request('_cfg_affiche')) { $cfg->param['cfg_id'] = implode('/', array_map('_request', $cfg->champs_id)); } return true; } /** * * @param string $nom * @param Object $cfg * @return string */ function cfg_pre_traiter_cfg_id($nom, &$cfg){ // lorsque c'est un champ de type multi que l'on modifie // et si l'identifiant a change, il faut soit le copier, soit de deplacer // // pour ca, on compare le hidden name='cfg_id' aux champs editables // qui ont la classe css 'cfg_id' if ($cfg->champs_id) { $new_id = implode('/', array_map('_request', $cfg->champs_id)); if ($new_id != $cfg->param['cfg_id']){ // si c'est un deplacement, on efface if (!_request('_cfg_copier')) { // et ne pas perdre les valeurs suite a l'effacement dans ce cas precis $vals = $cfg->val; $cfg->effacer(); $cfg->val = $vals; } $cfg->param['cfg_id'] = $new_id; // recreer un depot avec le nouvel identifiant // (sinon les requetes ne creent pas les bons 'where') include_spip('inc/cfg_config'); $cfg->depot = new cfg_depot($cfg->param['depot'], $cfg->params); // recharger le formulaire avec le nouvel identifiant (sinon les parametres // de formulaires qui contienent // #ENV{cfg_id} ou #ENV{id} ne sont pas a jour) $cfg->formulaire(); } } return true; } ?> cfg/classes/type_idnum.php000066600000001500151452626520011636 0ustar00val[$champ])){ $cfg->ajouter_erreur(_T('cfg:erreur_type_idnum', array('champ'=>$champ))); } return true; } /** * * @param string $champ * @param Object $cfg * @return string */ function cfg_pre_traiter_type_idnum($champ, &$cfg){ $cfg->val[$champ] = intval($cfg->val[$champ]); return true; } ?> cfg/classes/cfg_fichier.php000066600000024363151452626520011725 0ustar00champs[$nom], $cfg->extensions['cfg_fichier'][$nom]); // sinon indiquer un changement // pour eviter le message d'erreur "pas de changement" } else { set_request($nom, ''. $cfg->val[$nom]); } return $cfg; } /** * Pré-traitement du fichier $nom * * @param string $nom * @param Object $cfg * @return Object */ function cfg_pre_traiter_cfg_fichier($nom, &$cfg){ include_spip('inc/flock'); // enlever $cfg->val[$nom] = str_replace('','', $cfg->val[$nom]); // effacement if (_request('_cfg_delete')){ $supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier'; if (!$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) { $cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom]))); } // ajout ou modification } else { $f = cfg_get_info_fichier_upload($nom); if ($f['tmp_name']) { // suppression de l'ancien fichier $supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier'; if ($cfg->val[$nom] && !$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) { $cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom]))); } else { if (!$fichier = cfg_ajoute_un_document($f['tmp_name'],$f['name'],$nom, 'config/'.$cfg->vue)){ $cfg->messages['erreurs'][$nom] = _T('cfg:erreur_copie_fichier', array('fichier'=>'config/'.$cfg->vue . '/' . $f['name'])); } else { $cfg->val[$nom] = set_spip_doc($fichier); } } } } return $cfg; } /** * * @param string $nom * @return string */ function cfg_get_info_fichier_upload($nom){ return $_FILES ? $_FILES[$nom] : $GLOBALS['HTTP_POST_FILES'][$nom]; } /** * Ajouter un document (au format $_FILES)
* (n'ajoute pas le contenu en base dans spip_documents...) * * @param string $source Le fichier sur le serveur (/var/tmp/xyz34) * @param string $nom_envoye Son nom chez le client (portequoi.pdf) * @param string $nom_dest Le nom sous lequel le sauvegarder * @param string $dans Où l'enregistrer * @return string */ function cfg_ajoute_un_document($source, $nom_envoye, $nom_dest, $dans='config') { include_spip('inc/modifier'); include_spip('inc/ajouter_documents'); $type_image = ''; // au pire // tester le type de document : // - interdit a l'upload ? // - quelle extension dans spip_types_documents ? // - est-ce "inclus" comme une image ? preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match); @list(,$titre,$ext) = $match; $ext = corriger_extension(strtolower($ext)); // ajouter l'extension au nom propose... $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); if ($row) { $type_inclus_image = ($row['inclus'] == 'image'); // hum stocke dans IMG/$ext ? $fichier = cfg_copier_document($ext, $nom_dest.'.'.$ext, $source, $dans); } else { /* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */ $type_inclus_image = false; if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) { spip_log("Extension $ext interdite a l'upload"); return; } $ext = 'zip'; if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return; spip_unlink($tmp_dir); @mkdir($tmp_dir); $tmp = $tmp_dir.'/'.translitteration($nom_envoye); $nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $tmp) : deplacer_fichier_upload($source, $tmp); include_spip('inc/pclzip'); $source = _DIR_TMP . 'archive.zip'; $archive = new PclZip($source); $v_list = $archive->create($tmp, PCLZIP_OPT_REMOVE_PATH, $tmp_dir, PCLZIP_OPT_ADD_PATH, ''); effacer_repertoire_temporaire($tmp_dir); if (!$v_list) { spip_log("Echec creation du zip "); return; } // hum too ? $fichier = cfg_copier_document($ext, $nom_dest.'.zip', $source, $dans); spip_unlink($source); } if ($ext == "svg") { // supprimer les scripts traite_svg($fichier); } elseif ($ext != "mov") {// image ? // Si c'est une image, recuperer sa taille et son type (detecte aussi swf) $size_image = @getimagesize($fichier); $type_image = decoder_type_image($size_image[2]); } // Quelques infos sur le fichier if (!$fichier OR !@file_exists($fichier) OR !$taille = @intval(filesize($fichier))) { spip_log ("Echec copie du fichier $fichier"); return; } if (!$type_image) { if (_DOC_MAX_SIZE > 0 AND $taille > _DOC_MAX_SIZE*1024) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($taille)))); } } else { // image if (_IMG_MAX_SIZE > 0 AND $taille > _IMG_MAX_SIZE*1024) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($taille)))); } if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT AND ($size_image[0] > _IMG_MAX_WIDTH OR $size_image[1] > _IMG_MAX_HEIGHT)) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_taille', array( 'maxi' => _T('info_largeur_vignette', array('largeur_vignette' => _IMG_MAX_WIDTH, 'hauteur_vignette' => _IMG_MAX_HEIGHT)), 'actuel' => _T('info_largeur_vignette', array('largeur_vignette' => $size_image[0], 'hauteur_vignette' => $size_image[1])) ))); } } return $fichier; } /** * Copier un document * * @param string $ext L'extension du fichier * @param string $dest le nom sous lequel le sauvegarder * @param string $source le fichier sur le serveur (/var/tmp/xyz34) * @param string $dans Où le copier * @return string */ function cfg_copier_document($ext, $dest, $source, $dans='_cfg') { $dest = preg_replace(',\.\.+,', '.', $dest); // pas de .. dans le nom du doc $dir = cfg_creer_repertoire_cfg($dans); $dest = preg_replace("/[^._=-\w\d]+/", "_", translitteration(preg_replace("/\.([^.]+)$/", "", preg_replace("/<[^>]*>/", '', basename($dest))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); $newFile = $dir . $dest .'.'.$ext; return _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $newFile) : deplacer_fichier_upload($source, $newFile); } /** * Creer IMG/config/vue * comme "creer_repertoire_documents" mais avec 2 profondeurs * * @param string $ext * @return string */ function cfg_creer_repertoire_cfg($ext) { list($racine, $vue) = explode('/',$ext,2); if ($rep = sous_repertoire(_DIR_IMG, $racine)){ $rep = sous_repertoire(_DIR_IMG.$racine, $vue); } if (!$ext OR !$rep) { spip_log("creer_repertoire_cfg interdit"); exit; } // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint if ($GLOBALS['meta']["creer_htaccess"] == 'oui') { include_spip('inc/acces'); verifier_htaccess($rep); } return $rep; } /* * compat 1.9.2 : * il y a plein de fonctions qui ont change !! */ if (_COMPAT_CFG_192) { /** * pas de securite tuante sur .. comme en 1.9.3
* * @deprecated depuis SPIP 2.0 * @param string $source Le nom du fichier source * @param string $dest Le nom du fichier de destination * @param boolean $move TRUE si on le déplace * @return boolean|string La destination comme 1.9.3 */ function cfg_deplacer_fichier_upload($source, $dest, $move=false) { // Securite if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE) $dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE))); else $dest = preg_replace(',\.\.+,', '.', $dest); if ($move) $ok = @rename($source, $dest); else $ok = @copy($source, $dest); if (!$ok) $ok = @move_uploaded_file($source, $dest); if ($ok) @chmod($dest, _SPIP_CHMOD & ~0111); else { $f = @fopen($dest,'w'); if ($f) { fclose ($f); } else { include_spip('inc/headers'); redirige_par_entete(generer_url_action("test_dirs", "test_dir=". dirname($dest), true)); } @unlink($dest); } return $ok ? $dest : false; } /** * Supprimer le fichier de maniere sympa (flock) * * @deprecated depuis SPIP 2.0 * @param string $fichier Le nom du fichier à supprimer * @return boolean */ function cfg_supprimer_fichier($fichier) { if (!@file_exists($fichier)) return true; // verrouiller le fichier destination if ($fp = @fopen($fichier, 'a')) @flock($fp, LOCK_EX); else return false; // liberer le verrou @flock($fp, LOCK_UN); @fclose($fp); // supprimer return @unlink($fichier); } if (!function_exists('set_spip_doc')){ /** * donne le chemin du fichier relatif a _DIR_IMG
* pour stockage 'tel quel' dans la base de donnees * * @deprecated depuis SPIP 2.0 * @param string $fichier * @return string */ function set_spip_doc($fichier) { if (strpos($fichier, _DIR_IMG) === 0) return substr($fichier, strlen(_DIR_IMG)); else return $fichier; // ex: fichier distant } } if (!function_exists('get_spip_doc')){ /** * donne le chemin complet du fichier * * @deprecated depuis SPIP 2.0 * @param string $fichier * @return string */ function get_spip_doc($fichier) { // fichier distant if (preg_match(',^\w+://,', $fichier)) return $fichier; // gestion d'erreurs, fichier='' if (!strlen($fichier)) return false; // fichier normal return (strpos($fichier, _DIR_IMG) === false) ? _DIR_IMG . $fichier : $fichier; } } } ?> cfg/classes/type_id.php000066600000001210151452626520011114 0ustar00val[$champ])){ $cfg->ajouter_erreur(_T('cfg:erreur_type_id', array('champ'=>$champ))); } return true; } ?> exec/cfg.php000066600000005015151452626520006755 0ustar00traiter(); // // affichages // include_spip("inc/presentation"); if (!$config->autoriser()) { echo $config->acces_refuse(); exit; } pipeline('exec_init',array('args'=>array('exec'=>'cfg'),'data'=>'')); $commencer_page = charger_fonction('commencer_page', 'inc'); echo $commencer_page($config->get_boite(), 'cfg', $config->get_nom()); echo "


\n"; echo gros_titre(sinon($config->get_titre(), _T('cfg:configuration_modules')), '', false); echo $config->barre_onglets(); // colonne gauche echo debut_gauche('', true); // si un formulaire cfg est demande if ($s = $config->descriptif()) echo debut_boite_info(true) . $s . fin_boite_info(true); // affiche éventuellement une colonne supplémentaire à gauche if ($s = $config->gauche()) echo debut_boite_info(true) . $s . fin_boite_info(true); echo pipeline('affiche_gauche',array('args'=>array('exec'=>'cfg'),'data'=>'')); echo creer_colonne_droite('', true); echo pipeline('affiche_droite',array('args'=>array('exec'=>'cfg'),'data'=>'')); // affichage des messages envoyes par cfg if ($s = $config->messages()) echo debut_boite_info(true) . $s . fin_boite_info(true); // affichage des liens if ($s = $config->liens()) echo debut_boite_info(true) . $s . fin_boite_info(true); if ($s = $config->liens_multi()) echo debut_boite_info(true) . $s . fin_boite_info(true); echo debut_droite("", true); // centre de la page if ($config->get_presentation() == 'auto') { echo debut_cadre_trait_couleur('', true, '', $config->get_boite()); echo $config->formulaire(); echo fin_cadre_trait_couleur(true); } else { echo $config->formulaire(); } // pied echo fin_gauche() . fin_page(); } ?> tests/depot_tablepack.php000066600000013206151452626520011556 0ustar00 'element 1', 'two' => 'element 2', 'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3") ); $serassoc = serialize($assoc); $essais = array(); $essais[] = array(true, 'tablepack::~/test_cfg_zero', 0); $essais[] = array(true, 'tablepack::~/test_cfg_zeroc', '0'); $essais[] = array(true, 'tablepack::~/test_cfg_chaine', 'une chaine'); $essais[] = array(true, 'tablepack::~/test_cfg_assoc', $assoc); $essais[] = array(true, 'tablepack::~/test_cfg_serie', serialize($assoc)); // chemins $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier', $assoc); $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/truc', 'trac'); // dans rubriques $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', '', '', '', '0,1'); $essais[] = array(true, "tablepack::rubriques@extra:$id_rubrique/test_cfg_chemin/casier/truc", 'trac'); $essais[] = array(true, "tablepack::rubrique@extra:$id_rubrique/test_cfg_chemin/casier/chose", 'trac'); $err = tester_fun('ecrire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('ecrire_config tablepack
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(0, 'tablepack::~/test_cfg_zero'); $essais[] = array('0', 'tablepack::~/test_cfg_zeroc'); $essais[] = array('une chaine', 'tablepack::~/test_cfg_chaine'); $essais[] = array($assoc, 'tablepack::~/test_cfg_assoc'); $essais[] = array(serialize($assoc), 'tablepack::~/test_cfg_serie'); // chemins $essais[] = array($assoc + array('truc'=>'trac'), 'tablepack::~/test_cfg_chemin/casier'); $essais[] = array('trac', 'tablepack::~/test_cfg_chemin/casier/truc'); $essais[] = array(1, 'tablepack::~/test_cfg_chemin/casier/three/un'); // chemin pas la $essais[] = array(null, 'tablepack::~/test_cfg_chemin/casier/three/huit'); // dans rubrique $essais[] = array('trac', "tablepack::rubriques@extra:$id_rubrique/test_cfg_chemin/casier/truc"); $essais[] = array('trac', "tablepack::rubrique@extra:$id_rubrique/test_cfg_chemin/casier/chose"); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture ecrire_config tablepack
' . join('', $err) . '
'); } ### re effacer_config ### $essais = array(); $essais[] = array(true, 'tablepack::~/test_cfg_zero'); $essais[] = array(true, 'tablepack::~/test_cfg_zeroc'); $essais[] = array(true, 'tablepack::~/test_cfg_chaine'); $essais[] = array(true, 'tablepack::~/test_cfg_assoc'); $essais[] = array(true, 'tablepack::~/test_cfg_serie'); // chemins // on enleve finement tout test_cfg_chemin : il ne doit rien rester $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/huit'); // n'existe pas $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/troisc'); $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/deux'); $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/three/un'); // supprime three $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/one'); $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/two'); $essais[] = array(true, 'tablepack::~/test_cfg_chemin/casier/truc'); // supprimer chemin/casier // dans rubrique $essais[] = array(true, "tablepack::rubriques@extra:$id_rubrique/test_cfg_chemin/casier/truc"); $essais[] = array(true, "tablepack::rubrique@extra:$id_rubrique/test_cfg_chemin/casier/chose"); $err = tester_fun('effacer_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('effacer_config tablepack
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(null, 'tablepack::~/test_cfg_zero'); $essais[] = array(null, 'tablepack::~/test_cfg_zeroc'); $essais[] = array(null, 'tablepack::~/test_cfg_chaine'); $essais[] = array(null, 'tablepack::~/test_cfg_assoc'); $essais[] = array(null, 'tablepack::~/test_cfg_serie'); $essais[] = array(null, 'tablepack::~/test_cfg_chemin'); // dans rubrique $essais[] = array(null, "tablepack::rubriques@extra:$id_rubrique/test_cfg_chemin/casier/truc"); $essais[] = array(null, "tablepack::rubrique@extra:$id_rubrique/test_cfg_chemin/casier/chose"); $essais[] = array(null, "tablepack::rubriques@extra:$id_rubrique/test_cfg_chemin"); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture effacer_config tablepack
' . join('', $err) . '
'); } echo "OK"; ?> tests/depot_differents.php000066600000003665151452626520011771 0ustar00 'element 1', 'two' => 'element 2', 'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3") ); $serassoc = serialize($assoc); // on flingue meta a juste nos donnees $GLOBALS['meta'] = array( 'zero' => serialize(0), 'zeroc' => serialize('0'), 'chaine' => serialize('une chaine'), 'assoc' => serialize($assoc), 'serie' => serialize(serialize($assoc)) ); // racine $essais[] = array(0, 'metapack::zero'); $essais[] = array('0', 'metapack::zeroc'); $essais[] = array('une chaine', 'metapack::chaine'); $essais[] = array(array('un'=>1, 'deux'=>2, 'troisc'=>"3"), 'metapack::assoc/three'); $err = tester_fun('lire_config', $essais); // retablissement des metas $GLOBALS['meta']=$meta; // si le tableau $err est pas vide ca va pas if ($err) { die ('lire_config metapack
' . join('', $err) . '
'); } // on flingue meta a juste nos donnees $GLOBALS['meta'] = array( 'zero' => 0, 'zeroc' => '0', 'chaine' => 'une chaine', 'assoc' => $assoc, 'serie' => serialize($assoc) ); $essais = array(); $essais[] = array(0, 'zero'); $essais[] = array('0', 'zeroc'); $essais[] = array('une chaine', 'chaine'); $err = tester_fun('lire_config', $essais); // retablissement des metas $GLOBALS['meta']=$meta; // si le tableau $err est pas vide ca va pas if ($err) { die ('lire_config meta
' . join('', $err) . '
'); } echo "OK"; ?> tests/depot_metapack.php000066600000012250151452626520011413 0ustar00 'element 1', 'two' => 'element 2', 'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3") ); $serassoc = serialize($assoc); // on flingue meta a juste nos donnees $GLOBALS['meta'] = array( 'zero' => serialize(0), 'zeroc' => serialize('0'), 'chaine' => serialize('une chaine'), 'assoc' => serialize($assoc), 'serie' => serialize(serialize($assoc)) ); // racine $essais[] = array(0, 'metapack::zero'); $essais[] = array('0', 'metapack::zeroc'); $essais[] = array('une chaine', 'metapack::chaine'); $essais[] = array($assoc, 'metapack::assoc'); $essais[] = array(serialize($assoc), 'metapack::serie'); $essais[] = array(null, 'metapack::rien'); $essais[] = array('defaut', 'metapack::rien','defaut'); // chemins $essais[] = array($assoc, 'metapack::assoc/'); $essais[] = array('element 1', 'metapack::assoc/one'); $essais[] = array(array('un'=>1, 'deux'=>2, 'troisc'=>"3"), 'metapack::assoc/three'); $essais[] = array(1, 'metapack::assoc/three/un'); $essais[] = array('3', 'metapack::assoc/three/troisc'); // racourcis $essais[] = array($assoc, 'assoc/'); $essais[] = array('element 1', 'assoc/one'); $err = tester_fun('lire_config', $essais); // retablissement des metas $GLOBALS['meta']=$meta; // si le tableau $err est pas vide ca va pas if ($err) { die ('lire_config metapack
' . join('', $err) . '
'); } ### ecrire_config ### $essais = array(); $essais[] = array(true, 'metapack::test_cfg_zero', 0); $essais[] = array(true, 'metapack::test_cfg_zeroc', '0'); $essais[] = array(true, 'metapack::test_cfg_chaine', 'une chaine'); $essais[] = array(true, 'metapack::test_cfg_assoc', $assoc); $essais[] = array(true, 'metapack::test_cfg_serie', serialize($assoc)); // chemins $essais[] = array(true, 'metapack::test_cfg_chemin/casier', $assoc); $essais[] = array(true, 'metapack::test_cfg_chemin/casier/truc', 'trac'); $err = tester_fun('ecrire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('ecrire_config metapack
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(0, 'metapack::test_cfg_zero'); $essais[] = array('0', 'metapack::test_cfg_zeroc'); $essais[] = array('une chaine', 'metapack::test_cfg_chaine'); $essais[] = array($assoc, 'metapack::test_cfg_assoc'); $essais[] = array(serialize($assoc), 'metapack::test_cfg_serie'); // chemins $essais[] = array($assoc + array('truc'=>'trac'), 'metapack::test_cfg_chemin/casier'); $essais[] = array('trac', 'metapack::test_cfg_chemin/casier/truc'); $essais[] = array(1, 'metapack::test_cfg_chemin/casier/three/un'); // chemin pas la $essais[] = array(null, 'metapack::test_cfg_chemin/casier/three/huit'); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture ecrire_config metapack
' . join('', $err) . '
'); } ### re effacer_config ### $essais = array(); $essais[] = array(true, 'metapack::test_cfg_zero'); $essais[] = array(true, 'metapack::test_cfg_zeroc'); $essais[] = array(true, 'metapack::test_cfg_chaine'); $essais[] = array(true, 'metapack::test_cfg_assoc'); $essais[] = array(true, 'metapack::test_cfg_serie'); // chemins // on enleve finement tout test_cfg_chemin : il ne doit rien rester $essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/huit'); // n'existe pas $essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/troisc'); $essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/deux'); $essais[] = array(true, 'metapack::test_cfg_chemin/casier/three/un'); // supprime three $essais[] = array(true, 'metapack::test_cfg_chemin/casier/one'); $essais[] = array(true, 'metapack::test_cfg_chemin/casier/two'); $essais[] = array(true, 'metapack::test_cfg_chemin/casier/truc'); // supprimer chemin/casier $err = tester_fun('effacer_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('effacer_config metapack
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(null, 'metapack::test_cfg_zero'); $essais[] = array(null, 'metapack::test_cfg_zeroc'); $essais[] = array(null, 'metapack::test_cfg_chaine'); $essais[] = array(null, 'metapack::test_cfg_assoc'); $essais[] = array(null, 'metapack::test_cfg_serie'); $essais[] = array(null, 'metapack::test_cfg_chemin'); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture effacer_config metapack
' . join('', $err) . '
'); } echo "OK"; ?> tests/depot_php.php000066600000010262151452626520010416 0ustar00 'element 1', 'two' => 'element 2', 'three' => array('un'=>1, 'deux'=>2, 'troisc'=>"3") ); ### ecrire_config ### $essais = array(); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_zero', 0); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_zeroc', '0'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chaine', 'une chaine'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_assoc', $assoc); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_serie', serialize($assoc)); // chemins $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier', $assoc); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/truc', 'trac'); $err = tester_fun('ecrire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('ecrire_config php
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(0, 'php::tests_cfg_php/test_cfg_zero'); $essais[] = array('0', 'php::tests_cfg_php/test_cfg_zeroc'); $essais[] = array('une chaine', 'php::tests_cfg_php/test_cfg_chaine'); $essais[] = array($assoc, 'php::tests_cfg_php/test_cfg_assoc'); $essais[] = array(serialize($assoc), 'php::tests_cfg_php/test_cfg_serie'); // chemins $essais[] = array($assoc + array('truc'=>'trac'), 'php::tests_cfg_php/test_cfg_chemin/casier'); $essais[] = array('trac', 'php::tests_cfg_php/test_cfg_chemin/casier/truc'); $essais[] = array(1, 'php::tests_cfg_php/test_cfg_chemin/casier/three/un'); // chemin pas la $essais[] = array(null, 'php::tests_cfg_php/test_cfg_chemin/casier/three/huit'); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture ecrire_config php
' . join('', $err) . '
'); } ### re effacer_config ### $essais = array(); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_zero'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_zeroc'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chaine'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_assoc'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_serie'); // chemins // on enleve finement tout test_cfg_chemin : il ne doit rien rester $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/huit'); // n'existe pas $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/troisc'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/deux'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/three/un'); // supprime three $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/one'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/two'); $essais[] = array(true, 'php::tests_cfg_php/test_cfg_chemin/casier/truc'); // supprimer chemin/casier $err = tester_fun('effacer_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('effacer_config php
' . join('', $err) . '
'); } ### re lire_config ### $essais = array(); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_zero'); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_zeroc'); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_chaine'); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_assoc'); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_serie'); $essais[] = array(null, 'php::tests_cfg_php/test_cfg_chemin'); $essais[] = array(null, 'php::tests_cfg_php'); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture effacer_config php
' . join('', $err) . '
'); } echo "OK"; ?> tests/depot_meta.php000066600000007566151452626520010572 0ustar00 'element 1', 'two' => 'element 2'); $serassoc = serialize($assoc); // on flingue meta a juste nos donnees $GLOBALS['meta'] = array( 'zero' => 0, 'zeroc' => '0', 'chaine' => 'une chaine', 'assoc' => $assoc, 'serie' => serialize($assoc) ); $essais[] = array(0, 'zero'); $essais[] = array('0', 'zeroc'); $essais[] = array('une chaine', 'chaine'); $essais[] = array($assoc, 'assoc'); $essais[] = array($assoc, 'serie'); $essais[] = array(serialize($assoc), 'serie','',0); $essais[] = array(null, 'rien'); $essais[] = array('defaut', 'rien','defaut'); $err = tester_fun('lire_config', $essais); // retablissement des metas $GLOBALS['meta']=$meta; // si le tableau $err est pas vide ca va pas if ($err) { die ('lire_config meta
' . join('', $err) . '
'); } ### ecrire_config meta ### /* * Notes sur l'ecriture : * - dans le tableau $GLOBALS['meta'], les valeurs transmises * conservent effectivement leur type * - si l'on applique un lire_metas() (reecriture du tableau $GLOBALS['meta'] * depuis les informations de la table spip_meta, les types de valeurs * sont tous des types string (puisque la colonne 'valeur' de spip_meta est * varchar (ou text). * - 0 devient alors '0' * - array(xxx) devient 'Array' * * Cela ne se produit pas avec le depot 'metapack' qui serialize systematiquement * tout ce qu'on lui donne (et peut donc restituer le type de donnee correctement). * */ $essais = array(); $essais[] = array(true, 'test_cfg_zero', 0); $essais[] = array(true, 'test_cfg_zeroc', '0'); $essais[] = array(true, 'test_cfg_chaine', 'une chaine'); $essais[] = array(true, 'test_cfg_assoc', $assoc); $essais[] = array(true, 'test_cfg_serie', serialize($assoc)); $err = tester_fun('ecrire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('ecrire_config meta
' . join('', $err) . '
'); } ### re lire_config meta ### $essais = array(); $essais[] = array(0, 'test_cfg_zero'); $essais[] = array('0', 'test_cfg_zeroc'); $essais[] = array('une chaine', 'test_cfg_chaine'); $essais[] = array($assoc, 'test_cfg_assoc'); $essais[] = array(serialize($assoc), 'test_cfg_serie','',0); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture ecrire_config meta
' . join('', $err) . '
'); } ### re effacer_config meta ### $essais = array(); $essais[] = array(true, 'test_cfg_zero'); $essais[] = array(true, 'test_cfg_zeroc'); $essais[] = array(true, 'test_cfg_chaine'); $essais[] = array(true, 'test_cfg_assoc'); $essais[] = array(true, 'test_cfg_serie'); $err = tester_fun('effacer_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('effacer_config meta
' . join('', $err) . '
'); } ### re lire_config meta ### $essais = array(); $essais[] = array(null, 'test_cfg_zero'); $essais[] = array(null, 'test_cfg_zeroc'); $essais[] = array(null, 'test_cfg_chaine'); $essais[] = array(null, 'test_cfg_assoc'); $essais[] = array(null, 'test_cfg_serie'); $err = tester_fun('lire_config', $essais); // si le tableau $err est pas vide ca va pas if ($err) { die ('relecture effacer_config meta
' . join('', $err) . '
'); } echo "OK"; ?> inc/cfg_config.php000066600000016425151452626520010136 0ustar00 1) list($depot,$args) = $r; else { // si un seul argument, il faut trouver le depot $depot = cfg_charger_depot_args($args); } $depot = new cfg_depot($depot); $depot->charger_args($args); return $depot; } function cfg_charger_depot_args($args){ if ($args[0] == '~'){ return'tablepack'; } elseif ( (list($head, ) = explode('/',$args,2)) && (strpos($head,':') !== false)) { return'tablepack'; } else { if (strpos($args,'/') !== false) return'metapack'; else return'meta'; } } /** * cette classe charge les fonctions de lecture et ecriture d'un depot (dans depots/) * * Ces depots ont une version qui evoluera en fonction si des changements d'api apparaissent * * version 2 (fonctions) * - charger_args * - lire, ecrire, effacer * * @package plugins * @subpackage cfg */ class cfg_depot{ /** * Le nom de la classe du dépôt * @var string */ var $nom; /** * Le dépôt * @var Object */ var $depot; /* * * Constructeur de la classe * * 'depot' est le nom du fichier php stocke dans /depots/{depot}.php * qui contient une classe 'cfg_depot_{depot}' * * $params est un tableau de parametres passes a la classe cfg_depot_{depot} qui peut contenir : * * 'champs' => array( * 'nom'=>array( * 'balise' => 'select|textarea|input', // nom de la balise * 'type' => 'checkbox|hidden|text...', // type d'un input * 'tableau' => bool, // est-ce un champ tableau name="champ[]" ? * 'cfg' => 'xx', // classe css commencant par css_xx * 'id' => y, // cle du tableau 'champs_id' (emplacement qui possede ce champ) * ), * 'champs_id' => array( * cle => 'nom' // nom d'un champ de type id * ), * 'param' => array( * 'parametre_cfg' => 'valeur' // les parametres passes dans les formulaires cfg * ), * 'val' => array( * 'nom' => 'valeur' // les valeurs des champs sont stockes dedans * ) * ); * * * @param string $depot * @param Array $params */ function cfg_depot($depot='metapack', $params=array()){ if (!isset($params['param'])) { $params['param'] = array(); } include_spip('depots/'.$depot); if (!class_exists($class = 'cfg_depot_'.$depot)) { die("CFG ne trouve pas le dépot $depot"); } $this->depot = new $class($params); $this->version = $this->depot->version; $this->nom = $depot; } /** * ajoute les parametres transmis dans l'objet du depot * * @param Array $params */ function add_params($params){ foreach ($params as $o=>$v) { $this->depot->$o = $v; } } /** * récupérer les enregistrements des différents champs. * @param Array $params * @return Array */ function lire($params = array()){ $this->add_params($params); return $this->depot->lire(); // array($ok, $val, $messages) } /** * ecrit chaque enregistrement pour chaque champ. * @param Array $params * @return Array */ function ecrire($params = array()){ $this->add_params($params); return $this->depot->ecrire(); // array($ok, $val, $messages) } /** * supprime chaque enregistrement pour chaque champ. * @param Array $params * @return Array */ function effacer($params = array()){ $this->add_params($params); return $this->depot->effacer(); // array($ok, $val, $messages) } /** * Lecture de la configuration * * @param boolean $unserialize * @return string */ function lire_config($unserialize=true){ list($ok, $s) = $this->depot->lire($unserialize); if ($ok && ($nom = $this->nom_champ())) { return $s[$nom]; } elseif ($ok) { return $s; } } /** * enregistrer une configuration * * @param mixed $valeur * @return boolean */ function ecrire_config($valeur){ if ($nom = $this->nom_champ()) { $this->depot->val = array($nom=>$valeur); } else { $this->depot->val = $valeur; } list($ok, $s) = $this->depot->ecrire(); return $ok; } /** * supprimer une config * * @return boolean */ function effacer_config(){ if ($nom = $this->nom_champ()){ $this->depot->val[$nom] = false; } else { $this->depot->val = null; } list($ok, $s) = $this->depot->effacer(); return $ok; } /** * le nom d'un champ s'il est dans le dépôt * @return boolean|string */ function nom_champ(){ if (count($this->depot->champs)==1){ foreach ($this->depot->champs as $nom=>$def){ return $nom; } } return false; } /** * charge les arguments d'un lire/ecrire/effacer_config * dans le depot : lire_config($args = 'metapack::prefixe/casier/champ'); * * @param Array $args * @return boolean */ function charger_args($args){ if (method_exists($this->depot, 'charger_args')){ return $this->depot->charger_args($args); } return false; } } /** * 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('montruc/sub') est l'element "sub" de cette config * comme la balise pour ~, ~id_auteur ou table:id
* * $unserialize est mis par l'histoire, et affecte le depot 'meta' * * @param string $cfg la config * @param mixed $def un defaut optionnel * @param boolean $unserialize n'affecte que le depot 'meta' * @return string */ if (!function_exists('lire_config')) { function lire_config($cfg='', $def=null, $unserialize=true) { $depot = cfg_charger_depot($cfg); $r = $depot->lire_config($unserialize); if (is_null($r)) return $def; return $r; } } /** * enregistrer une configuration * * @param string $cfg * @param mixed $valeur * @return boolean */ if (!function_exists('ecrire_config')) { function ecrire_config($cfg='', $valeur=null){ $depot = cfg_charger_depot($cfg); return $depot->ecrire_config($valeur); } } /** * supprimer une config * * @param string $cfg * @return boolean */ if (!function_exists('effacer_config')) { function effacer_config($cfg=''){ $depot = cfg_charger_depot($cfg); return $depot->effacer_config(); } } ?> inc/cfg_formulaire.php000066600000061755151452626520011044 0ustar00 */ var $depot = null; /** * le fond html utilise , en general pour config simple idem $nom * @var string */ var $vue = ''; /** * l'adresse du fond html (sans l'extension .html) * @var string */ var $path_vue = ''; /** * provient-on d'un formulaire de type CVT (charger/verifier/traiter) dans formulaires/ ? * @var boolean */ var $depuis_cvt = false; /** * compte-rendu des mises a jour * @var Array */ var $messages = array('message_ok'=>array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * les champs trouve dans le fond * @var Array */ var $champs = array(); /** * les champs index * @var Array */ var $champs_id = array(); /** * leurs valeurs * @var Array */ var $val = array(); /** * pour tracer les valeurs modifiees * @var string */ var $log_modif = ''; /** * contenu du fichier de formulaire * @var string */ var $controldata =''; /** * stockage du fond compile par recuperer_fond() * @var */ var $fond_compile = ''; /** * y a t-il des extensions (classes css 'type_{nom}' ou 'cfg_{nom}' sur champs) a traiter ? * @var Array */ var $extensions = array(); /** * Alias pour passer facilement les parametres aux classes appelees * @var Array */ var $params = array(); /** * Constructeur de la classe * * @param string $nom * @param string $cfg_id * @param Array $opt */ function cfg_formulaire($nom, $cfg_id = '', $opt = array()) { $this->param = array( 'afficher_messages' => true, // afficher ce compte rendu ? 'autoriser' => 'configurer', // le "faire" de autoriser($faire), par defaut, autoriser_configurer_dist() 'autoriser_absence_id' => 'non', // autoriser l'insertion de nouveau contenu dans une table sans donner d'identifiant ? 'casier' => '', // sous tableau optionel du meta ou va etre stocke le fragment de config 'cfg_id' => '', // pour une config multiple , l'id courant 'descriptif' => '', // descriptif 'depot' => 'metapack', // (ancien 'storage') le depot utilise pour stocker les donnees, par defaut metapack: spip_meta serialise 'fichier' => '', // pour storage php, c'est l'adresse du fichier (depuis la racine de spip), sinon ca prend /local/cfg/nom.php 'gauche' => '', // pour une colonne à gauche 'head' => '', // partie du fond cfg a inserer dans le head par le pipeline header_prive (todo insert_head?) 'icone' => '', // lien pour une icone 'inline' => '', // code qui sera insere apres le contenu du fond (peut servir pour inserer du js) 'interpreter' => 'oui', // si interpreter vaut 'non', le fond ne sera pas traite comme un fond cfg, mais comme une inclusion simple (pas de recherche des champs de formulaires). Cela permet d'utiliser des #FORMULAIRES_XX dans un fonds/ tout en utilisant la simplicite des parametres par exemple. 'liens' => array(), // liens optionnels sur des sous-config 'liens_multi' => array(), // liens optionnels sur des sous-config pour des fonds utilisant un champ multiple 'nom' => '', // le nom du meta (ou autre) ou va etre stocke la config concernee 'onglet' => 'oui', // cfg doit-il afficher un lien vers le fond sous forme d'onglet dans la page ?exec=cfg 'presentation' => 'auto', // cfg doit-il encadrer le formulaire tout seul ? 'refus' => '', // en cas de refus d'autorisation, un message informatif [(#REM) refus=...] 'table' => '', // nom de la table sql pour storage extra ou table ); $this->param['nom'] = $this->vue = $nom; $this->param['cfg_id'] = $cfg_id; // exception flagrante : le formulaire 'configurer' // si c'est un formulaire generique, le nom et l'id ne sont pas bon. if ($this->vue == 'configurer') { $this->param['nom'] = $cfg_id; $this->param['cfg_id'] = ''; } // definition de l'alias params $this->params = array( 'champs' => &$this->champs, 'champs_id' => &$this->champs_id, 'messages' => &$this->messages, 'val' => &$this->val, 'param' => &$this->param ); foreach ($opt as $o=>$v) { $this->$o = $v; } // charger les donnees du fond demande $this->charger(); } /** * retourne true en cas d'erreur... * * @return boolean */ function erreurs(){ return $this->messages['erreurs'] || $this->messages['message_erreur']; } /** * ajoute une erreur sur un champ donne * * @param string $champ * @param string $message */ function ajouter_erreur($champ, $message) { $this->messages['erreurs'][$champ] = isset($this->messages['erreurs'][$champ]) ? $this->messages['erreurs'][$champ] .= '
' . $message : $message; } /** * ajoute des erreurs sur les champs indiques dans le tableau * (comme verifier de cvt) * * @param Array $err * @return boolean */ function ajouter_erreurs($err) { if (!is_array($err)) return false; if (isset($err['message_erreur']) && $err['message_erreur']) $this->messages['message_erreur'][] = $err['message_erreur']; if (isset($err['message_ok']) && $err['message_ok']) $this->messages['message_ok'][] = $err['message_ok']; unset($err['message_erreur'], $err['message_ok']); if ($err) $this->messages['erreurs'] = $err; // ou un merge ?? // return true; } /** * pre-analyser le formulaire, * c'est a dire recuperer les parametres CFG * et les noms des champs du formulaire * * @return boolean */ function charger(){ $ok = true; // si pas de fichier, rien a charger if (!$this->vue) return false; // lecture de la vue (fond cfg) // il s'agit de recuperer le contenu du fichier if (!$fichier = find_in_path($nom = 'fonds/cfg_' . $this->vue .'.html')){ if ($fichier = find_in_path($nom = 'formulaires/' . $this->vue .'.html')) $this->depuis_cvt = true; } // si pas de fichier, rien a charger if (!$fichier) return false; if (!lire_fichier($fichier, $this->controldata)) { $ok = false; $this->messages['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $nom)); } else { $this->path_vue = substr($fichier,0,-5); } // recherche et stockage des parametres de cfg $this->recuperer_parametres(); // si le fond ne doit pas etre calcule comme un fond CFG, // on s'arrete ici. De cette maniere, CFG ne prendra pas // comme des champs a recuperer les champs issus d'un autre formulaire // CFG inclu depuis un formulaire CVT via #FORMULAIRE_XX if ($this->param['interpreter'] == 'non') return true; // recherche et stockage des noms de champs de formulaire if ($err = $this->recuperer_noms_champs()){ $ok = false; $this->messages['message_erreur'][] = $err; } // charger les champs particuliers si existants $this->actionner_extensions('pre_charger'); // creer le storage et lire les valeurs $this->param['depot'] = strtolower(trim($this->param['depot'])); include_spip('inc/cfg_config'); $this->depot = new cfg_depot($this->param['depot'], $this->params); $ok &= $this->lire(); // charger les champs particuliers si existants $this->actionner_extensions('charger'); return $ok; } /** * Doit controler la validite des valeurs transmises * * Verifie les valeurs postees. * - stocke les valeurs qui ont changees dans $this->val[$nom_champ] = 'nouvelle_valeur' * - verifie que les types de valeurs attendus sont corrects ($this->verifier_champs_types) * * retourne les messages d'erreur * @return boolean|string */ function verifier() { if ($this->erreurs() || !$this->autoriser()) return false; // si on a pas poste de formulaire, pas la peine de controler // ce qui mettrait de fausses valeurs dans l'environnement if (!_request('_cfg_ok') && !_request('_cfg_delete')) return true; // les formulaires CVT ont deja leurs securites if (!$this->depuis_cvt) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); } // actions par champs speciaux, avant les tests des nouvelles valeurs $this->actionner_extensions('pre_verifier'); // stockage des nouvelles valeurs foreach ($this->champs as $name => $def) { // enregistrement des valeurs postees $oldval = $this->val[$name]; $this->val[$name] = _request($name); // tracer les modifications if ($oldval != $this->val[$name]) { $this->log_modif .= $name . ':' . var_export($oldval, true) . '/' . var_export($this->val[$name], true) .', '; } } // si pas de changement, pas la peine de continuer if (!$this->log_modif && !_request('_cfg_delete')) { $this->messages['message_erreur'][] = _T('cfg:pas_de_changement', array('nom' => $this->nom_config())); return false; } // verifier la validite des champs speciaux (cfg_xx, type_xx) $this->actionner_extensions('verifier'); // stocker le fait que l'on a controle les valeurs $this->verifier = true; return !$this->erreurs(); } /** * Gere le traitement du formulaire. * * Si le chargement ou le controle n'ont pas ete fait, * la fonction s'en occupe. * * @return boolean */ function traiter() { if (!$this->verifier) $this->verifier(); if ($this->erreurs() || !$this->autoriser()) return false; if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false; // les formulaires CVT ont deja leurs securites if (!$this->depuis_cvt) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); } $this->actionner_extensions('pre_traiter'); if ($this->erreurs()) return false; // suppression if (_request('_cfg_delete')) { $this->effacer(); // sinon modification } else { $this->ecrire(); } // pipeline 'cfg_post_edition' ? (quelqu'un utilise ??) $this->messages = pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages)); $this->actionner_extensions('post_traiter'); // annuler le cache de SPIP include_spip('inc/invalideur'); suivre_invalideur('cfg/' . $this->param['nom'] . ($this->param['casier'] ? '/' . $this->param['casier'] : '') . ($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : '')); } /** * Determine l'arborescence ou CFG doit chercher les valeurs deja enregistrees * * si nom=toto, casier=chose/truc, cfg_id=2, * cfg cherchera dans #CONFIG{toto/chose/truc/2} * * @return string */ function nom_config() { return $this->param['nom'] . ($this->param['casier'] ? '/' . $this->param['casier'] : '') . ($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : ''); } /** * Recherche et stockage * des parametres #REM passes a CFG * * @deprecated (DEPRECIE) */ function recuperer_parametres_rem(){ // cas de #REM (deprecie) preg_replace_callback('/(\[\(#REM\) ([a-z0-9_]\w+)(\*)?=)(.*?)\]/sim', array(&$this, 'post_params'), $this->controldata); } /** * cette fonction recherche et stocke les parametres passes a cfg par * ces lignes sont alors effacees du code html. Ces proprietes sont lues apres recuperer_fond(), * et interpretent donc les balises spip et les chaines de langues * * si la fonction est appelee 2 fois, les parametres identiques ne seront pas copies * sauf si le parametre est un tableau (), les valeurs seront dupliquees */ function recuperer_parametres(){ // pour compatibilite, recuperer l'ancien code #REM $this->recuperer_parametres_rem(); $this->recuperer_fond(); $this->fond_compile = preg_replace_callback('/(/sim', array(&$this, 'post_params'), $this->fond_compile); // s'il en reste : il y a un probleme ! // est-ce utile de tester ça ? if (preg_match('//sim', '', $this->fond_compile); } /** * Recherche des noms des champs (y) du formulaire * stockes dans le tableau $this->champs * a l'exception des noms par _cfg_, reserves a ce plugin * * @return string */ function recuperer_noms_champs(){ if (!$this->vue) return; // recherche d'au moins un champ de formulaire pour savoir si la vue est valide $this->recuperer_fond(); if (!preg_match_all( /* '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="[^"]*?(?:type_(\w+))?[^"]*?(?:cfg_(\w+))?[^"]*?")?( multiple=)?[^>]*?>#ims', */ '#<(?:(select|textarea)|input type="(text|password|checkbox|radio|hidden|file)") name="(\w+)(\[\])?"(?: class="([^"]*)")?( multiple=)?[^>]*?>#ims', $this->fond_compile, $matches, PREG_SET_ORDER)) { return _T('cfg:pas_de_champs_dans', array('nom' => $this->vue)); } foreach ($matches as $regs) { $name = $regs[3]; if (substr($name, 0, 5) == '_cfg_') continue; $this->champs[$name] = array('balise' => $regs[1]); // input type if ($regs[2]) $this->champs[$name]['type'] = $regs[2]; // champs tableau[] if ($regs[4]) $this->champs[$name]['tableau'] = true; // // Extensions et validations des champs // via les classes css // // attention : ordre important : // if ($regs[5]) { $tcss = explode(' ',trim($regs[5])); foreach($tcss as $css){ // classes css type_xx if (substr($css,0,5)=='type_') { $this->ajouter_extension($css, $name); // classes css cfg_xx } elseif (substr($css,0,4)=='cfg_') { $this->champs[$name]['cfg'] = substr($css,4); // juste 'id' si classe = cfg_id $this->ajouter_extension($css, $name); } } } // cas particulier automatiques : // * input type file => type de verification : fichier if (($regs[2] == 'file') AND (!$this->champs[$name]['cfg'])){ $this->champs[$name]['cfg'] = 'fichier'; $this->ajouter_extension('cfg_fichier', $name); } } return ''; } /** * ajoute une extension (classe cfg_xx ou type_xx) * * ce qui dit a cfg d'executer des fonctions particulieres * si elles existent : ex: cfg_traiter_cfg_xx() * lors de l'appel de 'actionner_extensions($faire)' * * @param string $ext * @param string $nom */ function ajouter_extension($ext, $nom){ if (!is_array($this->extensions[$ext])) $this->extensions[$ext] = array(); $this->extensions[$ext][] = $nom; } /** * ajoute une extension sur un parametre * seulement si un fichier sur ce parametre existe * * @param string $param * @return boolean */ function ajouter_extension_parametre($param){ if (in_array($param, $this->extensions_parametres)) return true; if (find_in_path('cfg/params/'.$param.'.php')){ $this->extensions_parametres[] = $param; return true; } return false; } /** * Compiler le fond CFG si ce n'est pas fait * * @param Array $contexte * @param boolean $forcer * @return string */ function recuperer_fond($contexte = array(), $forcer = false){ if (!$this->fond_compile OR $forcer){ include_spip('inc/presentation'); // offrir les fonctions d'espace prive include_spip('public/assembler'); // rendre editable systematiquement // sinon, ceux qui utilisent les fonds CFG avec l'API des formulaires dynamiques // et mettent des [(#ENV**{editable}|oui) ... ] ne verraient pas leurs variables // dans l'environnement vu que CFG ne pourrait pas lire les champs du formulaire if ($this->depuis_cvt) if (!isset($contexte['editable'])) $contexte['editable'] = true; // plante 1.9.2 !! // passer cfg_id... if (!isset($contexte['cfg_id']) && $this->param['cfg_id']) { $contexte['cfg_id'] = $this->param['cfg_id']; } // passer id aussi if (!isset($contexte['id']) && $this->param['cfg_id']) { $contexte['id'] = $this->param['cfg_id']; } // passer 'message_ok', 'message_erreur', 'erreurs' if (!isset($contexte['message_ok']) && $this->messages['message_ok']) { $contexte['message_ok'] = join('
',$this->messages['message_ok']); } if (!isset($contexte['message_erreur']) && $this->messages['message_erreur']) { $contexte['message_erreur'] = join('
',$this->messages['message_erreur']); } if (!isset($contexte['erreurs']) && $this->messages['erreurs']) { $contexte['erreurs'] = $this->messages['erreurs']; } // cas particulier du formulaire generique 'configurer' if ($this->vue == 'configurer') { if (!isset($contexte['id'])) { $contexte['id'] = $this->param['nom']; } } $val = $this->val ? array_merge($contexte, $this->val) : $contexte; // si on est dans l'espace prive, $this->path_vue est // de la forme ../plugins/mon_plugin/fonds/toto, d'ou le replace $this->fond_compile = recuperer_fond( substr($this->path_vue, strlen(_DIR_RACINE)), $val); } return $this->fond_compile; } /** * Verifie les autorisations * d'affichage du formulaire * (parametre autoriser=faire) * * @staticvar int $autoriser * @return int */ function autoriser() { static $autoriser=-1; if ($autoriser !== -1) return $autoriser; // on peut passer 'oui' ou 'non' directement au parametre autoriser if ($this->param['autoriser'] == 'oui') return $autoriser = 1; if ($this->param['autoriser'] == 'non') { $this->messages['message_refus'] = $this->param['refus']; return $autoriser = 0; } // sinon, test de l'autorisation // // include_spip('inc/autoriser'); if (!$autoriser = autoriser($this->param['autoriser'])){ $this->messages['message_refus'] = $this->param['refus']; } return $autoriser; } /** * Log le message passe en parametre * $this->log('message'); * * @param string $message */ function log($message) { ($GLOBALS['auteur_session'] && ($qui = $GLOBALS['auteur_session']['login'])) || ($qui = $GLOBALS['ip']); spip_log('cfg (' . $this->nom_config() . ') par ' . $qui . ': ' . $message); } /** * lit les donnees depuis le depot * * @return boolean */ function lire(){ list ($ok, $val, $messages) = $this->depot->lire($this->params); if ($messages) $this->messages = $messages; if ($ok) { $this->val = $val; } else { $this->messages['message_erreur'][] = _T('cfg:erreur_lecture', array('nom' => $this->nom_config())); } return $ok; } /** * Ecrit les donnees dans le depot * * @return string */ function ecrire() { list ($ok, $val, $messages) = $this->depot->ecrire($this->params); if ($messages) $this->messages = $messages; if ($ok){ $this->val = $val; $this->messages['message_ok'][] = $msg = _T('cfg:config_enregistree', array('nom' => $this->nom_config())); } else { $this->messages['message_erreur'][] = $msg = _T('cfg:erreur_enregistrement', array('nom' => $this->nom_config())); } $this->log($msg . ' ' . $this->log_modif); return $msg; } /** * Efface les donnees dans le depot * * dans le cas d'une suppression, il faut vider $this->val qui * contient encore les valeurs du formulaire, sinon elles sont * passees dans le fond et le formulaire garde les informations * d'avant la suppression * * @return string */ function effacer(){ list ($ok, $val, $messages) = $this->depot->effacer($this->params); if ($messages) $this->messages = $messages; if ($ok) { $this->val = $val; $this->messages['message_ok'][] = $msg = _T('cfg:config_supprimee', array('nom' => $this->nom_config())); } else { $this->messages['message_erreur'][] = $msg = _T('cfg:erreur_suppression', array('nom' => $this->nom_config())); } $this->log($msg); return $msg; } /** * Fabriquer les balises des champs d'apres un modele fonds/cfg_.html * $contexte est un tableau (nom=>valeur) * qui sera enrichi puis passe a recuperer_fond * * @param Array $contexte * @return string */ function formulaire($contexte = array()) { if (!$this->path_vue) return ''; if (!$this->depuis_cvt) $contexte['_cfg_'] = $this->creer_hash_cfg(); // recuperer le fond avec le contexte // forcer le calcul. $this->recuperer_fond($contexte, true); $this->recuperer_parametres(); //$this->effacer_parametres(); // pour enlever les ... sans dedoubler le contenu lorsque ce sont des tableau (param*=valeur) return $this->fond_compile; } /** * * @param string $action * @return string */ function creer_hash_cfg($action=''){ include_spip('inc/securiser_action'); $arg = 'cfg0.0.0-' . $this->param['nom'] . '-' . $this->vue; return '?cfg=' . $this->vue . '&cfg_id=' . $this->param['cfg_id'] . '&arg=' . $arg . '&hash=' . calculer_action_auteur($action . '-' . $arg); } /** * teste et charge les points d'entrees de CFG a travers certaines actions * *
    *
  1. : fonctions generales cfg_{nom}_{action}
  2. *
  3. : actions sur les types de champs particuliers * notifies par 'type_XX' ou 'cfg_YY' sur les classes css * s'ils existent dans /cfg/classes/ par des fonctions * cfg_{action}_{classe}
  4. *
  5. : actions en fonctions des parametres du formulaire * s'ils existent dans /cfg/params/ par des fonctions * cfg_{action}_{parametre}
  6. *
* * les actions possibles sont : * - pre_charger, charger, * - pre_verifier, verifier, * - pre_traiter, post_traiter * * @param string $action */ function actionner_extensions($action){ // 1 - general : on transmet l'instance de cfg_formulaire if (function_exists($f = 'cfg_' . $this->vue . '_' . $action)) { $res = $f($this); // compat ascendante (1.7 a 1.10.2) : verifier retournait un array comme cvt // il faut envoyer le resultat dans la fonction d'ajout des erreurs if ($action == 'verifier' AND is_array($res)) $this->ajouter_erreurs($res); } // 2 - type de champ : on transmet le nom du champ et l'instance de cfg_formulaire if ($this->extensions) { foreach ($this->extensions as $type => $champs){ // si un fichier de ce type existe, on lance la fonction // demandee pour chaque champs possedant la classe css en question if (include_spip('cfg/classes/'.$type)) { foreach ($champs as $champ){ if (function_exists($f = 'cfg_' . $action . '_' . $type)){ // absence possible normale $f($champ, $this); } } } } } // 3 - parametre : on transmet la valeur du parametre et l'instance de cfg_formulaire if ($this->extensions_parametres){ foreach ($this->extensions_parametres as $param){ if (include_spip('cfg/params/'.$param)) { if (function_exists($f = 'cfg_' . $action . '_param_' . $param)){ // absence possible normale // artillerie lourde on passe // la valeur et la classe $f($this->param[$param], $this); } } } } } /** *callback pour interpreter les parametres objets du formulaire * commun avec celui de set_vue() * * Parametres : * - $regs[2] = 'parametre' * - $regs[3] = '*' ou '' * - $regs[4] = 'valeur' * * Lorsque des parametres sont passes dans le formulaire * par
* stocker $this->param['parametre']=valeur * * Si
* Stocker $this->param['parametre'][]=valeur * * @param Array $regs * @return string */ function post_params($regs) { // $regs[3] peut valoir '*' pour signaler un tableau $regs[4] = trim($regs[4]); if (empty($regs[3])) { $this->param[$regs[2]] = $regs[4]; } elseif (is_array($this->param[$regs[2]])) { $this->param[$regs[2]][] = $regs[4]; } // plus besoin de garder ca return ''; } } ?> inc/cfg.php000066600000025777151452626520006623 0ustar00$ong){ if ($ong['afficher']) $ret .= '' .''._T('icone_configuration_site').' '.$fonds.''; } } return $ret; } /** * retourne un tableau contenant une liste de fonds cfg et leurs parametres * d'onglet (oui/non/titre_parent), plus quelques autres parametres (url, titre, icone), * pour un repertoire donne (sinon tout le path) * * @param string $dir * @return string */ function lister_onglets_cfg($dir='', $script='cfg'){ $onglets = array(); // scruter les onglets affichables if ($l = liste_cfg($dir)) { foreach($l as $fonds => $cfg) { if (!isset($onglets[$fonds])) $onglets[$fonds] = array(); $args = array(); $args['afficher'] = false; // On va chercher la config cible // et on regarde ses donnees pour faire l'onglet // seulement si l'onglet doit etre affiche include_spip('inc/cfg'); $tmp = new cfg($fonds); if ($tmp->autoriser()){ $args['onglet'] = $tmp->form->param['onglet']; $args['url'] = generer_url_ecrire($script, 'cfg='.$fonds); // titre if (!$args['titre'] = $tmp->form->param['titre']) $args['titre'] = $fonds; // icone $path = dirname(dirname($cfg)); $args['icone'] = ''; if ($tmp->form->param['icone']) $args['icone'] = $path.'/'.$tmp->form->param['icone']; else if (file_exists($path.'/plugin.xml')) $args['icone'] = 'plugin-24.gif'; else $args['icone'] = _DIR_PLUGIN_CFG.'cfg-doc-22.png'; // l'afficher ? if ($tmp->form->param['onglet'] == 'oui') $args['afficher'] = true; } $onglets[$fonds] = array_merge($args, $onglets[$fonds]); // conserver les donnees deja presentes ('enfant_actif') } } return $onglets; } /** * la classe cfg represente une page de configuration * * @package plugins * @subpackage cfg */ class cfg { var $form; // la classe cfg_formulaire /** * * @param string $nom * @param string $cfg_id * @param Array $opt */ function cfg($nom, $cfg_id = '', $opt = array()) { include_spip('inc/cfg_formulaire'); $this->form = new cfg_formulaire($nom, $cfg_id, $opt); } /** * Controller les droits pour traiter le formulaire de config * * @return int # 0 ou 1 */ function autoriser() {return $this->form->autoriser(); } /** * * @return boolean */ function traiter() {return $this->form->traiter();} /** * * @return string */ function get_titre(){ return $this->form->param['titre'];} /** * * @return string */ function get_nom() { return $this->form->param['nom'];} /** * * @return string */ function get_boite(){ if (!(($titre = $this->form->param['titre']) && ($boite = $this->form->param['boite']))){ $boite=($titre)?$titre: _T('icone_configuration_site') . ' ' . $this->form->param['nom']; } return $boite; } /** * pour pouvoir testé si la presentation des formulaires doit etre appliquee ou non * m'est avis que ca devrait virer cette 'presentation=auto'... * c'est comme 'rediriger', il n'y a que le plugin 'autorite' qui l'utilise * * @return string */ function get_presentation() { return $this->form->param['presentation']; } /** * Affiche la boite d'info des liens vers les autres fonds CFG * * Les liens sont definis par la variable liens * * s'il y a une chaine de langue 'moncfg', le texte sera traduit * ou * * pour utiliser la chaine de langue de prefixe_plugin * * @return string */ function liens() { $return = ''; // liens simples foreach ($this->form->param['liens'] as $lien) { $nom = _T($lien); $lien = array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue $return .= ($l = $this->generer_lien($lien, $nom)) ? "
  • $l
  • \n" : ""; } return ($return)?"
      $return
    ":''; } /** * Affiche un lien vers le fond dont le nom ($lien) * est passe en parametre * a condition que le fichier fonds/cfg_$lien.html existe * * @param string $lien * @param string $nom * @return string */ function generer_lien($lien, $nom='') { // nom est une chaine, pas une cle de tableau. if (empty($nom) OR !is_string($nom)) $nom = $lien; if (!find_in_path('fonds/cfg_'.$lien.'.html')) return ""; // si c'est le lien actif, pas de if (_request('cfg') == $lien) return "$nom\n"; else return "$nom\n"; // &cfg_id= <-- a ajouter ? } /** * Les liens multi sont appelles par liens_multi*=nom_du_fond * a condition que le fichier fonds/cfg_$lien.html existe * * @return string */ function liens_multi(){ // liens multiples foreach ($this->form->param['liens_multi'] as $lien) { $nom = _T($lien); $lien = array_pop(explode(':',$lien)); // ne garder que la derniere partie de la chaine de langue $return .= ($l = $this->generer_lien_multi($lien, $nom)) ? "
  • $l
  • \n" : ""; } return ($return)?"
      $return
    ":''; } /** * * @param string $lien * @param string $nom * @return string */ function generer_lien_multi($lien, $nom=''){ // nom est une chaine, pas une cle de tableau. if (empty($nom) OR !is_string($nom)) $nom = $lien; if (!find_in_path('fonds/cfg_'.$lien.'.html')) return ""; $dedans = ''; if (($exi = lire_config($lien)) && is_array($exi)) { foreach ($exi as $compte => $info) { $lid = $lien . "_" . $compte; $dedans .= "\n\n" . "
    \n"; } } // On ajoute un bouton 'nouveau' return "
    \n" . "

    $nom

    \n" . "\n" . "\n" . "\n" . "
    \n" . $dedans . "\n
    \n"; } /** * Affiche la liste des onglets de CFG * * Recupere les fonds CFG et analyse ceux-ci * - si onglet=oui : affiche l'onglet (valeur par defaut) * - si onglet=non : n'affiche pas l'onglet * - si onglet=fond_cfg_parent : n'affiche pas l'onglet, mais 'exposera' * l'element parent indique (sous entendu que * le parent n'a pas 'onglet=non' sinon rien ne sera expose... * * @return string # Le code HTML */ function barre_onglets(){ // determiner les onglets a cacher et a mettre en surbrillance if ($onglets = lister_onglets_cfg()){ foreach ($onglets as $fonds=>$ong){ $o = $ong['onglet']; // onglet actif if ($o == 'oui') $onglets[$fonds]['actif'] = ($fonds == _request('cfg')); // rendre actif un parent si l'enfant est actif (onglet=nom_du_parent // (/!\ ne pas le desactiver s'il a deja ete mis actif) if ($o && $o!='oui' && $o!='non'){ if (!isset($onglets[$o])) $onglets[$o]=array(); if (!isset($onglets[$o]['enfant_actif'])) $onglets[$o]['enfant_actif']=false; $onglets[$o]['enfant_actif'] = ($onglets[$o]['enfant_actif'] OR $fonds == _request('cfg')); } } } // retourner le code des onglets selectionnes $res = ""; if ($onglets) { $res = debut_onglet(); $n = -1; foreach ($onglets as $titre=>$args){ if ($args['afficher']){ // Faire des lignes s'il y en a effectivement plus de 6 if (!(++$n%6) && ($n>0)) $res .= fin_onglet().debut_onglet(); $res .= onglet( $args['titre'], $args['url'], 'cfg', ($args['actif'] || $args['enfant_actif']), $args['icone']); } } $res .= fin_onglet(); } return $res; } /** * affiche le descriptif du formulaire * * @return string */ function descriptif(){ if ($d = $this->form->param['descriptif']) return propre($d); } /** * affiche une colonne à gauche * * @return string */ function gauche(){ if ($d = $this->form->param['gauche']) return propre($d); } /** * affiche le message en cas d'acces interdit * * @return string */ function acces_refuse(){ include_spip('inc/minipres'); return minipres(_T('info_acces_refuse'), $this->form->param['refus'] ? $this->form->param['refus'] : " (cfg {$this->form->param[nom]} - {$this->form->vue} - {$this->form->param[cfg_id]})"); } /** * afficher les messages de cfg * * @return string */ function messages(){ $m = $this->form->messages; $messages = array(); if (count($m['message_ok'])) $messages[] = join('
    ', $m['message_ok']); if (count($m['message_erreur'])) $messages[] = join('
    ', $m['message_erreur']); if (count($m['erreurs'])) $messages[] = join('
    ', $m['erreurs']); if ($messages = trim(join('
    ', $messages))) { return propre($messages); } return ''; } /** * affichage du formulaire (ou a defaut du texte 'choisir le module a configurer') * * @return string */ function formulaire() { $retour = ""; if (!$formulaire = $this->form->formulaire()) { // Page appellee sans formulaire valable $retour .= "\n"; $retour .= "

    " . _T("cfg:choisir_module_a_configurer") . "

    "; } else { $retour .= $formulaire; } return $retour; } } ?> inc/compat_cfg.php000066600000017315151452626520010153 0ustar00code="''"; $p->interdire_scripts = false; return $p; } } /* fichier de compatibilite vers spip 1.9.2 */ if (version_compare($GLOBALS['spip_version_code'], '1.9300', '<') AND $f = charger_fonction('compat_cfg', 'inc')) $f(); /** * Gestion de la compatibilité avec SPIP 1.9.2 * * ceci n'est pas l'original du plugin compat mais la copie pour CFG * * En termes de distribution ce fichier PEUT etre recopie dans chaque plugin * qui desire en avoir une version autonome (voire forkee), A CONDITION DE * RENOMMER le fichier et ses deux fonctions ; c'est un peu lourd a maintenir * mais c'est le prix a payer pour l'independance des plugins entre eux :-( * * la version commune a tous est developpee sur * {@link http://zone.spip.org/spip-zone/browser/_dev_/compat/ svn://zone.spip.org/spip-zone/_dev_/compat/} * * @param Array $quoi */ function inc_compat_cfg_dist($quoi = NULL) { if (!function_exists($f = 'compat_cfg_defs')) $f .= '_dist'; $defs = $f(); include_spip('base/abstract_sql'); if (is_string($quoi)) $quoi = array($quoi); else if (is_null($quoi)) $quoi = array_keys($defs); foreach ($quoi as $d) { if (!function_exists($d) AND isset($defs[$d])) { eval ("function $d".$defs[$d]); } } } /** * Calcule le tableau de compatibilité des fonctions non définies sous SPIP2.0 * (fournit leur arbre syntaxique manipulé par le compilo) * * @return Array */ function compat_cfg_defs_dist() { $defs = array( // on fait au plus simple pour le journal 'journal' => '($phrase, $opt = array()) { return spip_log($phrase, \'journal\'); }', 'push' => '($array, $val) { if($array == \'\' OR !array_push($array, $val)) return \'\'; return $array; }', 'et' => '($code, $arg) { return ((($code) AND ($arg)) ?\' \' :\'\'); }', 'ou' => '($code, $arg) { return ((($code) OR ($arg)) ?\' \' :\'\'); }', 'xou' => '($code, $arg) { return ((($code) XOR ($arg)) ?\' \' :\'\'); }', 'non' => '($code) { return (($code) ?\'\' :\' \'); }', 'oui' => '($code) { return (($code) ?\' \' :\'\'); }', 'sql_fetch' => '( $res, $serveur=\'\' ) { return spip_fetch_array($res); }', 'sql_query' => '($res, $serveur=\'\') { return spip_query($res); }', // n'existe pas en 1.9.2 'sql_alter' => '($res, $serveur=\'\') { return spip_query(\'ALTER \' . $res); }', // n'existe pas en 1.9.2 // on cree la requete directement 'sql_delete' => '($table, $where=\'\', $serveur=\'\') { if (!is_array($table)) $table = array($table); if (!is_array($where)) $where = array($where); $query = \'DELETE FROM \' . implode(\',\', $table) . \' WHERE \' . implode(\' AND \', $where); return spip_query($query); }', // sql_quote : _q directement 'sql_quote' => '( $val, $serveur=\'\' ) { return _q($val); }', 'sql_select' => '( $select = array(), $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = \'\', $having = array(), $serveur=\'\' ) { return spip_abstract_select( $select, $from, $where, $groupby, $orderby, $limit, $sousrequete = \'\', $having, $table = \'\', $id = \'\', $serveur); }', 'sql_fetsel' => '( $select = array(), $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = \'\', $having = array(), $serveur=\'\' ) { return sql_fetch(sql_select( $select, $from, $where, $groupby, $orderby, $limit, $having, $serveur )); }', 'sql_getfetsel' => '( $select, $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = \'\', $having = array(), $serveur=\'\' ) { $r = sql_fetsel( $select, $from, $where, $groupby, $orderby, $limit, $having, $serveur ); return $r ? $r[$select] : NULL; }', 'sql_allfetsel' => '( $select, $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = \'\', $having = array(), $serveur=\'\' ) { $q = sql_select( $select, $from, $where, $groupby, $orderby, $limit, $having, $serveur ); if (!$q) return array(); $res = array(); while ($r = sql_fetch($q)) $res[] = $r; return $res; }', // n'existe pas en 1.9.2 // on cree la requete directement 'sql_update' => '( $table, $champs, $where=\'\', $desc=array(), $serveur=\'\' ) { if (!is_array($table)) $table = array($table); if (!is_array($champs)) $champs = array($champs); if (!is_array($where)) $where = array($where); $query = $r = \'\'; foreach ($champs as $champ => $val) $r .= \',\' . $champ . "=$val"; if ($r = substr($r, 1)) $query = \'UPDATE \' . implode(\',\', $table) . \' SET \' . $r . (empty($where) ? \'\' :\' WHERE \' . implode(\' AND \', $where)); if ($query) return spip_query($query); }', 'sql_updateq' => '( $table, $champs, $where=\'\', $desc=array(), $serveur=\'\' ) { if (!is_array($champs)) $exp = array($champs); foreach ($champs as $k => $val) { $champs[$k] = sql_quote($val); } return sql_update( $table, $champs, $where, $desc, $serveur ); }', // n'existe pas en 1.9.2 // on cree la requete directement 'sql_insertq' => '( $table, $champs ) { if (!is_array($champs)) $exp = array($champs); foreach ($champs as $k => $val) { $champs[$k] = sql_quote($val); } $query = "INSERT INTO $table (".implode(",", array_keys($champs)).") VALUES (".implode(",", $champs).")"; return sql_query($query); }', 'sql_showtable' => '($table, $serveur=\'\') { include_spip("base/abstract_sql"); return spip_abstract_showtable($table, \'mysql\', true); }', 'sql_count' => '( $res, $serveur=\'\' ) { return spip_mysql_count($res); }', 'sql_countsel' => '( $from = array(), $where = array(), $groupby = array(), $limit = \'\', $having = array(), $serveur=\'\' ) { return(sql_getfetsel(\'COUNT(*)\', $from, $where, $groupby, \'\', $limit, $having, $serveur)); }', 'sql_selectdb' => '( $res, $serveur=\'\' ) { $GLOBALS[\'spip_mysql_db\'] = mysql_select_db($res); return $GLOBALS[\'spip_mysql_db\']; }' ); return $defs; } ?> controleurs/config.php000066600000002571151452626520011122 0ustar00 $val); $n = new Crayon($crayon, $valeur); $contexte = array(); if (is_string($val) and preg_match(",[\n\r],", $val)) $contexte['config'] = array('type'=>'texte'); else $contexte['config'] = array('type'=>'ligne'); $html = $n->formulaire($contexte); include_spip('action/crayon_html'); $html = crayons_formulaire($html, 'crayons_config_store'); $status = NULL; return array($html, $status); } ?> svn.revision000066600000000533151452626520007147 0ustar00 Origine: file:///home/svn/repository/spip-zone/_plugins_/cfg/branches/v1 Revision: 58521 Dernier commit: 2012-02-17 21:06:15 +0100 file:///home/svn/repository/spip-zone/_plugins_/cfg/branches/v1 58521 2012-02-17 21:06:15 +0100 test_cfg.html000066600000000135151452626520007243 0ustar00[(#REM) Vous pouvez supprimer ce fichier sans danger. ] Fichier Sécurisé cfg.css.html000066600000001625151452626520007000 0ustar00#CACHE{7*24*3600} #HTTP_HEADER{Content-Type: text/css; charset=utf-8} #HTTP_HEADER{Vary: Accept-Encoding} /* Affichage de la balise CFG_ARBO */ .cfg_arbo h5{padding:0.2em 0.2em; margin:0.2em 0; cursor:pointer;} .cfg_arbo ul{border:1px solid #ccc; margin:0; padding:0.2em 0.5em; list-style-type:none;} /* Affichage des crayons/config */ .crayon-icones em.crayon-config { background: url(#CHEMIN{images/crayon20.png}) no-repeat; height: 20px; width: 20px; cursor: pointer; display: none; } .crayon-changed em.crayon-config { display: none; } /* formulaire auto configuration, boutons */ body.cfg #page .formulaire_spip {margin-bottom:2em;} .formulaire_configurer p.boutons .save {color:#3E7735;} .formulaire_configurer p.boutons .delete {color:#803923; float:left;} .formulaire_configurer p.boutons .reset {font-size:1em; margin-top:3px; margin-right:5px; font-weight:bold; color:#666; float:left;} cfg-doc-22.png000066600000001260151452626520007010 0ustar00PNG  IHDRĴl;bKGD pHYs B(xtIME  (`{=IDAT8˵kPL4#'xʦ'q9Cwh뒺{O^7x $?0@%vDIPס*Gq{⻻w'=O"BcQSJ|t~* ys^^^iJ)񻨸Lfc88??O@nJUWSBΦ6l}})l`)%J)<=! -5!NS. NP|\bqq!cZհ,:bq˻q s}}MZ}|ߏ35϶ml4M6anIӑJ)g8^ZP&E̖zT*XBr"2>06א:%Z,1`o %nFa~N(/;+tHRa %Nʿ4J'{( LA0: ԬN Gl6y75 irtI4Mk @ҾB0L8;77TIENDB`lang/cfg_de.php000066600000004753151452626520007432 0ustar00 'Löschen', 'bouton_mettre_a_jour' => 'Auf den neuesten Stand bringen', 'bouton_reset' => 'Zurücksetzen', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Wählen Sie das zu konfigurierende Modul', 'config_enregistree' => 'Speicherung von @nom@ erfolgreich', 'config_supprimee' => 'Löschen von @nom@ erfolgreich', 'configuration_modules' => 'Konfiguration der Module', // E 'erreur_copie_fichier' => 'Die Datei @fichier@ kann nicht an ihren Zielort kopiert werden.', 'erreur_enregistrement' => 'Ein Fehler ist aufgetreten beim Speichern von @nom@', 'erreur_lecture' => 'Fehler beim Lesen von @nom@', 'erreur_open_w_fichier' => 'Fehler beim Öffnen der Datei @fichier@ zum Schreiben', 'erreur_suppression' => 'Ein Fehler ist aufgetreten beim Löschen von @nom@', 'erreur_suppression_fichier' => 'Die Datei @fichier@ kann nicht gelöscht werden.', 'erreur_type_id' => 'Das Feld @champ@ muss mit einem Buchstaben oder einem Unterstrich beginnen.', 'erreur_type_idnum' => 'Das Feld @champ@ muss numerisch sein.', 'erreur_type_pwd' => 'Das Feld @champ@ benötigt mindestens 5 Zeichen.', // I 'id_manquant' => 'Fehlende ID', 'installation_librairies' => 'Herunterladen der Bibliotheken', 'installation_liste_libs' => 'Liste der Bibliotheken', 'installer_dossier_lib' => 'Sie müssen ein beschreibbares Verzeichnis mit dem Namen @dir@ im Wurzelverzeichnis Ihrer SPIP-Website anlegen.', 'installer_lib_192' => 'Um eine Bibliothek zu installieren, entpacken Sie die ZIP-Datei manuell und kopieren Sie den Inhalt des Archivs in das Verzeichnis @dir@.', // L 'label_activer' => 'Aktivieren', 'label_obligatoire' => 'Pflichtfeld', // N 'nom_table_manquant' => 'Fehlender Name der SQL Tabelle', 'nouveau' => 'Neu', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Kein Feld in @nom@ gefunden', 'pas_de_changement' => 'Keine Änderung in @nom@', // R 'refus_configuration_administrateur' => 'Nur die Administratoren der Site dürfen diese Einstellungen ändern.', 'refus_configuration_webmestre' => 'Nur ein Webmaster darf diese EInstellungen bearbeiten.', 'reset' => 'Reset', // S 'supprimer' => 'Standardeinstellungen wieder herstellen' ); ?> lang/cfg_pt_br.php000066600000004614151452626520010144 0ustar00 'Excluir', 'bouton_mettre_a_jour' => 'Atualizar', 'bouton_reset' => 'Limpar', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Escolha o módula para configurar', 'config_enregistree' => 'Inclusão de @nom@ efetuada', 'config_supprimee' => 'Exclusão de @nom@ efetuada', 'configuration_modules' => 'Configuração dos módulos', // E 'erreur_copie_fichier' => 'Não foi possível copiar o arquivo @fichier@ para o seu local definitivo', 'erreur_enregistrement' => 'Um erro ocorreu ao registrar @nom@', 'erreur_lecture' => 'Não foi possível ler @nom@', 'erreur_open_w_fichier' => 'Não foi possível abrir o arquivo @fichier@ para escrita', 'erreur_suppression' => 'Ocorreu um erro ao excluir @nom@', 'erreur_suppression_fichier' => 'Não foi possível excluir o arquivo @fichier@.', 'erreur_type_id' => 'O campo @champ@ precisa começar por uma letra ou sublinhado', 'erreur_type_idnum' => 'O campo @champ@ precisa ser numérico', 'erreur_type_pwd' => 'O campo @champ@ precisa ter mais de 5 caracteres', // I 'id_manquant' => 'Faltando identificador', 'installation_librairies' => 'Transferência de bibliotecas', 'installation_liste_libs' => 'Lista de bibliotecas', 'installer_dossier_lib' => 'Você precisa criar um diretório @dir@ na raiz do seu SPIP, com permissão de escrita.', 'installer_lib_192' => 'Para instalar uma biblioteca, expanda manualmente o zip e copie o seu conteúdo no diretório @dir@.', // L 'label_activer' => 'Ativar', 'label_obligatoire' => 'Campo obrigatório', // N 'nom_table_manquant' => 'Nome da tabela faltando', 'nouveau' => 'Novo', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Nenhum campo encontrado em @nom@', 'pas_de_changement' => 'Nenhuma alteração em @nom@', // R 'refus_configuration_administrateur' => 'Apenas os administradores do site estão autorizados a modificar estes parâmetros.', 'refus_configuration_webmestre' => 'Apenas os webmasters do site estão autorizados a modificar estes parâmetros.', 'reset' => 'Apagar', // S 'supprimer' => 'Voltar aos valores padrão' ); ?> lang/cfg.xml000066600000003400151452626520006757 0ustar00 lang/cfg_fr_tu.php000066600000004711151452626520010153 0ustar00 'Effacer', 'bouton_mettre_a_jour' => 'Mettre à jour', 'bouton_reset' => 'Reset', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Choisis le module à configurer.', 'config_enregistree' => 'Enregistrement de @nom@ effectué', 'config_supprimee' => 'Suppression de @nom@ effectué', 'configuration_modules' => 'Configuration des modules', // E 'erreur_copie_fichier' => 'Impossible de copier le fichier @fichier@ à son emplacement définitif', 'erreur_enregistrement' => 'Une erreur est survenue lors de l\'enregistrement de @nom@', 'erreur_lecture' => 'Impossible de lire @nom@', 'erreur_open_w_fichier' => 'Impossible d\'ouvrir le fichier @fichier@ en écriture', 'erreur_suppression' => 'Une erreur est survenue lors de la suppression de @nom@', 'erreur_suppression_fichier' => 'Impossible de supprimer le fichier @fichier@.', 'erreur_type_id' => 'Le champ @champ@ doit commencer par une lettre ou un souligné', 'erreur_type_idnum' => 'Le champ @champ@ doit être numerique', 'erreur_type_pwd' => 'Le champ @champ@ doit avoir plus de 5 caractères', // I 'id_manquant' => 'Identifiant manquant', 'installation_librairies' => 'Téléchargement de librairie', 'installation_liste_libs' => 'Liste des librairies', 'installer_dossier_lib' => 'Tu dois créer un dossier @dir@ à la racine de ton SPIP ayant des permissions d\'écriture.', 'installer_lib_192' => 'Pour installer une librairie, décompresse manuellement le zip et copie son contenu dans le dossier @dir@.', // L 'label_activer' => 'Activer', 'label_obligatoire' => 'Saisie obligatoire', // N 'nom_table_manquant' => 'Nom de la table SQL manquant', 'nouveau' => 'Nouveau', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Aucun champ trouvé dans @nom@', 'pas_de_changement' => 'Pas de changement dans @nom@', // R 'refus_configuration_administrateur' => 'Seuls les administrateurs du site sont autorisés à modifier ces paramètres.', 'refus_configuration_webmestre' => 'Seuls les webmestres du site sont autorisés à modifier ces paramètres.', 'reset' => 'Effacer', // S 'supprimer' => 'Remettre les valeurs par défaut' ); ?> lang/cfg_fa.php000066600000005646151452626520007432 0ustar00 'حذف كردن', 'bouton_mettre_a_jour' => 'روزآمدسازي', 'bouton_reset' => 'بازگذاري', // C 'cfg' => 'سي.اف.جي', 'choisir_module_a_configurer' => 'مدول پيكربندي را انتخاب كنيد.', 'config_enregistree' => 'ثبت @nom@ اجرا شده', 'config_supprimee' => 'حذف @nom@ اجرا شده', 'configuration_modules' => 'پيكربندي مدول‌ها', // E 'erreur_copie_fichier' => 'روبرداري از پرونده @fichier@ در جاي تعيين‌ شده‌اش ناممكن است', 'erreur_enregistrement' => 'هنگام ثبت @nom@ خطايي رخ داده', 'erreur_lecture' => 'خواندن @nom@ ناممكن است', 'erreur_open_w_fichier' => 'بازكردن پرونده @fichier@ هنگام نوشتن ناممكن است', 'erreur_suppression' => 'هنگام حذف @nom@ خطايي رخ داده ', 'erreur_suppression_fichier' => 'حذف پرونده @fichier@ ناممكن است.', 'erreur_type_id' => 'ميدان @champ@ بايد با يك حرف يا يك زيرخط آغاز شود', 'erreur_type_idnum' => 'ميدان@champ@ بايد عدد باشد ', 'erreur_type_pwd' => 'ميدان @champ@ بايد بيش از 5 كاراكتر داشته باشد', // I 'id_manquant' => 'معرف وجود ندارد', 'installation_librairies' => 'بارگذاري كتابخانه‌ها', 'installation_liste_libs' => 'فهرست كتابخانه‌ها', 'installer_dossier_lib' => 'شما بايد يك ديركتوري با نام @dir@ با با مجوز نوشنتن در ريشه‌ي سايت اسپيپ خود ايجاد كنيد.', 'installer_lib_192' => 'براي نصب يك كتابخانه،‌ زيپ را دستي بازكنيد و محتواي آن را در پوشه‌ي@dir@ كپي كنيد.', // L 'label_activer' => 'فعال سازي', 'label_obligatoire' => 'وارد كردن اجباري است', // N 'nom_table_manquant' => 'نام جدول اس.كيو.ال موجود نيست', 'nouveau' => 'جديد', // O 'ok' => 'او.كي', // P 'pas_de_champs_dans' => 'هيچ ميدان در @nom@ يافت نشد', 'pas_de_changement' => 'تغييري در @nom@ يافت نشد', // R 'refus_configuration_administrateur' => 'فقط مديران سايت مجازاند اين پارامتر‌ها را اصلاح كنند. ', 'refus_configuration_webmestre' => 'فقط وب‌ مسترهاي سايت مجازند اين پارامترها را اسلاح كنند. ', 'reset' => 'حذف ', // S 'supprimer' => 'بازبرحايي (ريست) با مقادير پيش‌ گزينه ' ); ?> lang/cfg_ru.php000066600000005773151452626520007473 0ustar00 'Удалить', 'bouton_mettre_a_jour' => 'Обновить', 'bouton_reset' => 'Сбросить', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Выбор плагина для конфигурации', 'config_enregistree' => '@nom@ сохранен', 'config_supprimee' => '@nom@ удален', 'configuration_modules' => 'Настройки плагина', // E 'erreur_copie_fichier' => 'Невозможно скопировать файл @fichier@', 'erreur_enregistrement' => 'Ошибка при сохранении @nom@', 'erreur_lecture' => 'Невозможно прочитать @nom@', 'erreur_open_w_fichier' => 'Невозможно открыть файл @fichier@ для записи', 'erreur_suppression' => 'Произошла ошибка при удалении @nom@', 'erreur_suppression_fichier' => 'Невозможно удалить файл @fichier@.', 'erreur_type_id' => 'Поле @champ@ должно начинаться с буквы или подчеркивания', 'erreur_type_idnum' => 'В поле @champ@ можно вводить только цифровые значения', 'erreur_type_pwd' => 'Введите более 5 символов в поле @champ@ ', // I 'id_manquant' => 'Пропущен идентификатор', 'installation_librairies' => 'Скачать библиотеки', 'installation_liste_libs' => 'Список библиотек', 'installer_dossier_lib' => 'Необходимо создать папку @dir@ в корне вашего сайта и устновить права на запись.', 'installer_lib_192' => 'Чтобы установить библиотеку, разархивируйте файл вручную и скопируйте содержимое в папку @dir@.', // L 'label_activer' => 'Включить', 'label_obligatoire' => 'Обязательный элемент', // N 'nom_table_manquant' => 'Невозможно определить название SQL таблицы', 'nouveau' => 'Новое', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Нет записи в @nom@', 'pas_de_changement' => 'Не обнаружены изменения в @nom@', // R 'refus_configuration_administrateur' => 'Только администратор сайта имеет права для изменения этих настроек.', 'refus_configuration_webmestre' => 'Только вебмастер сайта имеет право на изменение этих настроек.', 'reset' => 'Удалить', // S 'supprimer' => 'Сбросить в значения по умолчанию' ); ?> lang/cfg_cs.php000066600000004506151452626520007443 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Aktualizovat', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Vyberte modul pro konfiguraci', 'config_enregistree' => '@nom@ byl uložen', 'config_supprimee' => '@nom@ byl smazán', 'configuration_modules' => 'Konfigurace modulu', // E 'erreur_copie_fichier' => 'Není možné kopírovat soubor @fichier@ do jeho finálního umístění', 'erreur_enregistrement' => 'Během ukládání @nom@ se objevila chyba.', 'erreur_lecture' => 'Není možné číst @nom@', 'erreur_open_w_fichier' => 'Není možné otevřít @fichier@ pro zápis', 'erreur_suppression' => 'Během mazání @nom@ se objevila chyba', 'erreur_suppression_fichier' => 'Soubor @fichier@ nelze smazat.', 'erreur_type_id' => 'Položka @champ@ musí začínat písmenem nebo podtržítkem', 'erreur_type_idnum' => 'Pole @champ@ musí být numerické', 'erreur_type_pwd' => 'Pole @champ@ musí obsahovat více než 5 znaků', // I 'id_manquant' => 'Chybějící identifikátor', 'installation_librairies' => 'Stáhnout knihovny', 'installation_liste_libs' => 'Seznam knihoven', 'installer_dossier_lib' => 'Musíte vytvořit v kořenovém adresáři vaší instalace SPIP adresář pojmenovaný @dir@ a povolit do něj zápis ', 'installer_lib_192' => 'Pro instalaci knihovny ručně rozbalte ZIP soubor a jeho obsah nakopírujte do adresáře @dir@.', // L 'label_activer' => 'Aktivovat', 'label_obligatoire' => 'Povinné pole', // N 'nom_table_manquant' => 'Chybí jméno SQL tabulky', 'nouveau' => 'Nový', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'V @nom@ nebyla nalezena žádná položka', # MODIF 'pas_de_changement' => 'V @nom@ nebyly nalezeny žádné změny', // R 'refus_configuration_administrateur' => 'Tyto parametry mohou měnit pouze administrátoři.', 'refus_configuration_webmestre' => 'Tyto parametry mohou měnit pouze webmasteři.', 'reset' => 'Smazat', // S 'supprimer' => 'Smazat' # MODIF ); ?> lang/cfg_ca.php000066600000004712151452626520007420 0ustar00 'Esborrar', 'bouton_mettre_a_jour' => 'Actualització', 'bouton_reset' => 'Reiniciar', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Escolliu el mòdul a configurar.', 'config_enregistree' => 'Enregistrament de @nom@ realitzat', 'config_supprimee' => 'Suppressió de @nom@ realitzat', 'configuration_modules' => 'Configuració dels mòduls', // E 'erreur_copie_fichier' => 'Impossible copiar el fitxer @fichier@ al seu emplaçament definitiu', 'erreur_enregistrement' => 'Hi ha hagut un error durant l\'enregistrament de @nom@', 'erreur_lecture' => 'Impossible llegir @nom@', 'erreur_open_w_fichier' => 'Impossible obrir el fitxer @fichier@ en escriptura', 'erreur_suppression' => 'Ha ocorregut un errror durant la supressió de @nom@', 'erreur_suppression_fichier' => 'Impossible suprimir el fitxer @fichier@.', 'erreur_type_id' => 'El camp @champ@ ha de començar per una lletra o un subratllat', 'erreur_type_idnum' => 'El camp @champ@ ha de ser numèric', 'erreur_type_pwd' => 'El camp @champ@ ha de tenir més de 5 caràcters', // I 'id_manquant' => 'Falta identificador ', 'installation_librairies' => 'Descàrrega de llibreries', 'installation_liste_libs' => 'Llista de llibreries', 'installer_dossier_lib' => 'Heu de crear una carpeta @dir@ a l\'arrel del vostre SPIP que tingui permisos d\'escriptura.', 'installer_lib_192' => 'Per instal·lar una llibreria, descomprimiu manualment el zip i copieu el seu contingut a dins de la carpeta @dir@.', // L 'label_activer' => 'Activar', 'label_obligatoire' => 'Introducció obligatòria', // N 'nom_table_manquant' => 'Falta el nom de la taula SQL', 'nouveau' => 'Nou', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'No s\'ha trobat cap camp a @nom@', 'pas_de_changement' => 'Cap canvi a @nom@', // R 'refus_configuration_administrateur' => 'Només els administradors del lloc estan autoritzats a modificar aquests paràmetres.', 'refus_configuration_webmestre' => 'Només els webmestres del lloc estan autoritzats per modificar aquests paràmetres. ', 'reset' => 'Esborrar', // S 'supprimer' => 'Tornar a posar els valors per defecte' ); ?> lang/cfg_ro.php000066600000004765151452626520007465 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Aduceţi la zi', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Alegeţi modulul de configurat', 'config_enregistree' => 'Înregistrarea lui @nom@ a fost făcută', 'config_supprimee' => 'Ştergerea lui @nom@ a fost făcută', 'configuration_modules' => 'Configurarea modulelor', // E 'erreur_copie_fichier' => 'Imposibil de copiat fişierul @fichier@ în locaţia sa definitivă', 'erreur_enregistrement' => 'O eroare a intervenit în timpul înregistrării lui @nom@', 'erreur_lecture' => 'Imposibil de citit @nom@', 'erreur_open_w_fichier' => 'Imposibil de deschis fişierul @fichier@ în mod scriere', 'erreur_suppression' => 'O eroare a intervenit în timpul ştergerii lui @nom@', 'erreur_suppression_fichier' => 'Imposibil de şters fişierul @fichier@', 'erreur_type_id' => 'Câmpul @champ@ trebuie să înceapă cu o literă sau underscore (_)', 'erreur_type_idnum' => 'Câmpul @champ@ trebuie să fie numeric', 'erreur_type_pwd' => 'Câmpul @champ@ trebuie să aibă mai mult de 5 caractere', // I 'id_manquant' => 'Identificator care lipseşte', 'installation_librairies' => 'Descărcarea de librării', 'installation_liste_libs' => 'Lista de librării', 'installer_dossier_lib' => 'Trebuie să creaţi un director @dir@ în directorul rădăcină al site-ului SPIP - cu drepturi de scriere.', 'installer_lib_192' => 'Pentru a instala o librărie, decomprimaţi zip-ul şi copiaţi conţinutul său în directorul @dir@.', // L 'label_activer' => 'Activaţi', 'label_obligatoire' => 'Intrare obligatorie', // N 'nom_table_manquant' => 'Numele de tabelă SQL lipseşte', 'nouveau' => 'Nou', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Nici un câmp găsit în @nom@', # MODIF 'pas_de_changement' => 'Nici o schimbare în @nom@', // R 'refus_configuration_administrateur' => 'Doar administratorii site-ului sunt autorizaţi să modifice aceşti parametrii.', 'refus_configuration_webmestre' => 'Doar webmaster-ii acestui site sunt autorizati să modifice aceşti parametrii.', 'reset' => 'Ştergeţi', // S 'supprimer' => 'Ştergeţi' # MODIF ); ?> lang/cfg_fr.php000066600000004666151452626520007454 0ustar00 'Effacer', 'bouton_mettre_a_jour' => 'Mettre à jour', 'bouton_reset' => 'Reset', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Choisissez le module à configurer.', 'config_enregistree' => 'Enregistrement de @nom@ effectué', 'config_supprimee' => 'Suppression de @nom@ effectué', 'configuration_modules' => 'Configuration des modules', // E 'erreur_copie_fichier' => 'Impossible de copier le fichier @fichier@ à son emplacement définitif', 'erreur_enregistrement' => 'Une erreur est survenue lors de l\'enregistrement de @nom@', 'erreur_lecture' => 'Impossible de lire @nom@', 'erreur_open_w_fichier' => 'Impossible d\'ouvrir le fichier @fichier@ en écriture', 'erreur_suppression' => 'Une erreur est survenue lors de la suppression de @nom@', 'erreur_suppression_fichier' => 'Impossible de supprimer le fichier @fichier@.', 'erreur_type_id' => 'Le champ @champ@ doit commencer par une lettre ou un souligné', 'erreur_type_idnum' => 'Le champ @champ@ doit être numerique', 'erreur_type_pwd' => 'Le champ @champ@ doit avoir plus de 5 caractères', // I 'id_manquant' => 'Identifiant manquant', 'installation_librairies' => 'Téléchargement de librairies', 'installation_liste_libs' => 'Liste des librairies', 'installer_dossier_lib' => 'Vous devez creer un dossier @dir@ à la racine de votre SPIP ayant des permissions d\'ecriture.', 'installer_lib_192' => 'Pour installer une librairie, décompressez manuellement le zip et copiez son contenu dans le dossier @dir@.', // L 'label_activer' => 'Activer', 'label_obligatoire' => 'Saisie obligatoire', // N 'nom_table_manquant' => 'Nom de la table SQL manquant', 'nouveau' => 'Nouveau', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Aucun champ trouvé dans @nom@', 'pas_de_changement' => 'Pas de changement dans @nom@', // R 'refus_configuration_administrateur' => 'Seuls les administrateurs du site sont autorisés à modifier ces paramètres.', 'refus_configuration_webmestre' => 'Seuls les webmestres du site sont autorisés à modifier ces paramètres.', 'reset' => 'Effacer', // S 'supprimer' => 'Remettre les valeurs par défaut' ); ?> lang/cfg_br.php000066600000004610151452626520007435 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Hizivaat', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Dibabit ar vodulenn da gefluniañ.', 'config_enregistree' => 'Enrollet eo @nom@', 'config_supprimee' => 'Diverket eo @nom@', 'configuration_modules' => 'Kefluniañ ar modulennoù', // E 'erreur_copie_fichier' => 'Dibosupl eilañ ar restr @fichier@ en e lec\'hiadur da badout', 'erreur_enregistrement' => 'C\'hoarvezet ez eus ur fazi en ur enrollañ @nom@', 'erreur_lecture' => 'Dibosupl eo lenn @nom@', 'erreur_open_w_fichier' => 'Dibosupl eo digeriñ ar restr @fichier@ da skrivañ warni', 'erreur_suppression' => 'C\'hoarvezet ez eus ur fazi en ur ziverkañ @nom@', 'erreur_suppression_fichier' => 'Dibosupl diverkañ ar restr @fichier@.', 'erreur_type_id' => 'Ret eo d\'ar vaezienn @champ@ kregiñ gant ul lizherenn pe un istired', 'erreur_type_idnum' => 'Niverel e rank ar vaezienn @champ@ bezañ', 'erreur_type_pwd' => 'Ret eo d\'ar vaezienn @champ@ bezañ ouzhpenn 5 enni', // I 'id_manquant' => 'Kod anaout ezvezant', 'installation_librairies' => 'O pellgargañ levraouegoù', 'installation_liste_libs' => 'Roll al levraouegoù', 'installer_dossier_lib' => 'Ret eo deoc\'h krouiñ un teuliad @dir@ e gwrizienn ho SPIP dezhañ aotreoù skrivañ.', 'installer_lib_192' => 'A-benn staliañ ul levraoueg, diwaskit ar zip gant an dorn hag eilit an endalc\'had anezhañ en teuliad @dir@.', // L 'label_activer' => 'Gweredekaat', 'label_obligatoire' => 'Rekis eo skrivañ udb', // N 'nom_table_manquant' => 'Anv an daolenn SQL a vank', 'nouveau' => 'Nevez', // O 'ok' => 'Mat eo', // P 'pas_de_champs_dans' => 'Maezienn ebet kavet e @nom@', # MODIF 'pas_de_changement' => 'Kemm ebet e @nom@', // R 'refus_configuration_administrateur' => 'N\'eus nemet merourien al lec\'hienn a c\'hall kemmañ an arventennoù-se.', 'refus_configuration_webmestre' => 'N\'eus nemet webmistri al lec\'hienn a c\'hall kemmañ an arventennoù-se.', 'reset' => 'Diverkañ', // S 'supprimer' => 'Dilemel' # MODIF ); ?> lang/cfg_es.php000066600000004673151452626520007452 0ustar00 'Borrar', 'bouton_mettre_a_jour' => 'Actualizar', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Elige el módulo a configurar.', 'config_enregistree' => 'Efectuada la grabación de @nom@', 'config_supprimee' => 'Efectuada la supresión de @nom@', 'configuration_modules' => 'Configuración de los módulos', // E 'erreur_copie_fichier' => 'No es posible copiar el fichero @fichier@ en su emplazamiento definitivo', 'erreur_enregistrement' => 'Se ha producido un error al grabar @nom@', 'erreur_lecture' => 'No es posible leer @nom@', 'erreur_open_w_fichier' => 'No se puede abrir el fichero @fichier@ en modo escritura', 'erreur_suppression' => 'Se ha producido un error al suprimir @nom@', 'erreur_suppression_fichier' => 'No es posible suprimir el fichero @fichier@.', 'erreur_type_id' => 'El campo @champ@ debe comenzar por una letra o un subrayado', 'erreur_type_idnum' => 'El campo @champ@ debe ser numérico', 'erreur_type_pwd' => 'El campo @champ@ debe tener más de 5 caracteres', // I 'id_manquant' => 'Falta el identificador', 'installation_librairies' => 'Descarga de bibliotecas', 'installation_liste_libs' => 'Lista de bibliotecas', 'installer_dossier_lib' => 'Tienes que crear una carpeta @dir@ en tu carpeta raíz de SPIP con permiso de escritura.', 'installer_lib_192' => 'Para instalar una biblioteca, descomprime manualmente el zip y copia su contenido en la carpeta @dir@.', // L 'label_activer' => 'Activar', 'label_obligatoire' => 'Entrada obligatoria', // N 'nom_table_manquant' => 'Nombre de la tabla SQL que falta', 'nouveau' => 'Nuevo', // O 'ok' => 'SÍ', // P 'pas_de_champs_dans' => 'No se encuentra ningún campo en @nom@', # MODIF 'pas_de_changement' => 'Sin cambios en @nom@', // R 'refus_configuration_administrateur' => 'Sólo los administradores o administradoras del sitio están autorizados a modificar estos parámetros', 'refus_configuration_webmestre' => 'Sólo los y las webmaster del sitio están autorizados a modificar estos parámetros.', 'reset' => 'Borrar', // S 'supprimer' => 'Suprimir' # MODIF ); ?> lang/cfg_gl.php000066600000004623151452626520007440 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Actualizar', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Escoller o módulo para configuración.', 'config_enregistree' => 'Rexistro de @nom@ realizado', 'config_supprimee' => 'Supresión de @nom@ realizada', 'configuration_modules' => 'Configuración de módulos', // E 'erreur_copie_fichier' => 'Resultou imposible copiar o ficheiro @fichier@ ao seu emprazamento definitivo', 'erreur_enregistrement' => 'Un erro acaeu tras o rexistro de @nom@', 'erreur_lecture' => 'Imposible de ler @nom@', 'erreur_open_w_fichier' => 'Imposible de abrir o ficheiro @fichier@ en modo de escritura', 'erreur_suppression' => 'Un erro acaeu logo da supresión de @nom@', 'erreur_suppression_fichier' => 'Resultou imposible suprimir o ficheiro @fichier@.', 'erreur_type_id' => 'O campo @champ@ debe comezar por unha letra ou un subliñado', 'erreur_type_idnum' => 'O campo @champ@ debe ser numérico', 'erreur_type_pwd' => 'O campo @champ@ dbe ter máis de 5 caracteres', // I 'id_manquant' => 'Falta o identificador', 'installation_librairies' => 'Descarga de librerías', 'installation_liste_libs' => 'Lista de librarías', 'installer_dossier_lib' => 'Debe crear un dosier @dir@ na raíz do seu web SPIP cos permisos de escritura.', 'installer_lib_192' => 'Para instalar unha libraría, descomprima manualmente o zip e copie o seu contido no cartafol @dir@.', // L 'label_activer' => 'Activar', 'label_obligatoire' => 'Saída obrigada', // N 'nom_table_manquant' => 'Nome da táboa SQL que falta', 'nouveau' => 'Novo', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Ningún campo encontrado en @nom@', # MODIF 'pas_de_changement' => 'Ningún cambio en @nom@', // R 'refus_configuration_administrateur' => 'Soamente os administradores do web están autorizados para modificar estes parámetros.', 'refus_configuration_webmestre' => 'Só os webmasters do web están autorizados para modificar estes parámetros.', 'reset' => 'Borrar', // S 'supprimer' => 'Suprimir' # MODIF ); ?> lang/cfg_sv.php000066600000004613151452626520007465 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Uppdatera', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Välj en modul att konfigurera.', 'config_enregistree' => '@nom@ har sparats', 'config_supprimee' => '@nom@ har raderats', 'configuration_modules' => 'Konfigurering av moduler', // E 'erreur_copie_fichier' => 'Det går inte att kopiera filen @fichier@ till den rätta platsen', 'erreur_enregistrement' => 'Ett fel uppstod när @nom@sparades', 'erreur_lecture' => 'Det gick inte att läsa @nom@', 'erreur_open_w_fichier' => 'Det gick inte att öppna @fichier@ för ändringar', 'erreur_suppression' => 'Ett fel uppstod när @nom@raderades', 'erreur_suppression_fichier' => 'Filen @fichier@ kan inte raderas.', 'erreur_type_id' => 'fältet @champ@ måste börja med en bokstav eller underscore', 'erreur_type_idnum' => 'Fältet @champ@ måste vara numeriskt', 'erreur_type_pwd' => 'fältet @champ@ måste innehålla mer än 5 tecken', // I 'id_manquant' => 'identifierare saknas', 'installation_librairies' => 'ladda ned biblioteksfiler', 'installation_liste_libs' => 'lista över biblioteksfiler', 'installer_dossier_lib' => 'Du måste skapa en katalog med namnet @dir@ med skrivrättigheter i rotkatalogen i din SPIP-sajt.', 'installer_lib_192' => 'För att installera en biblioteksfil, dekomprimera den komprimerade filen och kopiera innehållet till katalogen @dir@.', // L 'label_activer' => 'Activer', # NEW 'label_obligatoire' => 'Saisie obligatoire', # NEW // N 'nom_table_manquant' => 'Tabellnamnet saknas', 'nouveau' => 'Ny', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Inget fält hittades i @nom@', # MODIF 'pas_de_changement' => 'Ingen förändring hittades i @nom@', // R 'refus_configuration_administrateur' => 'Seuls les administrateurs du site sont autorisés à modifier ces paramètres.', # NEW 'refus_configuration_webmestre' => 'Seuls les webmestres du site sont autorisés à modifier ces paramètres.', # NEW 'reset' => 'Radera', // S 'supprimer' => 'Radera' # MODIF ); ?> lang/cfg_it.php000066600000004715151452626520007454 0ustar00 'Cancella', 'bouton_mettre_a_jour' => 'Aggiorna', 'bouton_reset' => 'Reset', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Scegli il modulo da configurare.', 'config_enregistree' => 'Salvataggio di @nom@ effettuato', 'config_supprimee' => 'Cancellazione di @nom@ effettuata', 'configuration_modules' => 'Configurazione dei moduli', // E 'erreur_copie_fichier' => 'Impossibile copiare il file @fichier@ nella sua destinazione definitiva', 'erreur_enregistrement' => 'Si è verificato un errore durante il salvataggio di @nom@', 'erreur_lecture' => 'Impossibile leggere @nom@', 'erreur_open_w_fichier' => 'Impossibile aprire il file @fichier@ in scrittura', 'erreur_suppression' => 'Si è verificato un errore durante la cancellazione di @nom@', 'erreur_suppression_fichier' => 'Impossibile cancellare il file @fichier@.', 'erreur_type_id' => 'Il campo @champ@ deve cominciare con una lettera o un trattino basso', 'erreur_type_idnum' => 'Il campo @champ@ deve essere numerico', 'erreur_type_pwd' => 'Il campo @champ@ deve avere più di 5 caratteri', // I 'id_manquant' => 'Identificativo assente', 'installation_librairies' => 'Download delle librerie', 'installation_liste_libs' => 'Lista delle librerie', 'installer_dossier_lib' => 'Devi creare una cartella @dir@ nella radice di SPIP con il permesso di scrittura.', 'installer_lib_192' => 'Per installare una libreria, decomprimere manualmente il file zip ecopiare il suo contenuto della cartella @dir@.', // L 'label_activer' => 'Attiva', 'label_obligatoire' => 'Inserimento obbligatorio', // N 'nom_table_manquant' => 'Nome della tabella SQL mancante', 'nouveau' => 'Nuovo', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Nessun campo trovato in @nom@', 'pas_de_changement' => 'Nessun cambiamento in @nom@', // R 'refus_configuration_administrateur' => 'Solamente gli amministratori del sito sono autorizzati a modificare questi parametri.', 'refus_configuration_webmestre' => 'Solamente i webmaster del sito sono autorizzati a modificare questi parametri.', 'reset' => 'Cancella', // S 'supprimer' => 'Reimpostare i valori predefiniti' ); ?> lang/cfg_ast.php000066600000004746151452626520007633 0ustar00 'Desaniciar', 'bouton_mettre_a_jour' => 'Actualizar', 'bouton_reset' => 'Reaniciar', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Escoyer el módulu pa afitar.', 'config_enregistree' => 'Efeutuose la grabación de @nom@', 'config_supprimee' => 'Efeutuose\'l desaniciu de @nom@', 'configuration_modules' => 'Afitamientu de los módulos', // E 'erreur_copie_fichier' => 'Nun ye posible copiar el ficheru @fichier@ nel so asitiamientu definitivu', 'erreur_enregistrement' => 'Hubo un fallu demientres se grababa @nom@', 'erreur_lecture' => 'Nun ye posible lleer @nom@', 'erreur_open_w_fichier' => 'Nun ye posible abrir el ficheru @fichier@ pa escritura', 'erreur_suppression' => 'Hubo un fallu demientres se desaniciaba @nom@', 'erreur_suppression_fichier' => 'Nun ye posible desaniciar el ficheru @fichier@.', 'erreur_type_id' => 'El campu @champ@ tien qu\'entamar por una lletra o un sorrayáu', 'erreur_type_idnum' => 'El campu @champ@ tien que ser numbéricu', 'erreur_type_pwd' => 'El campu @champ@ tien que tener más de 5 carauteres', // I 'id_manquant' => 'Falta l\'identificaor', 'installation_librairies' => 'Descarga de biblioteques', 'installation_liste_libs' => 'Llista de les biblioteques', 'installer_dossier_lib' => 'Ties que crear un direutoriu @dir@ na raiz del to sitiu SPIP, que tenga permisu d\'escritura.', 'installer_lib_192' => 'Pa asitiar una biblioteca, hai que descomprimir el ficheru zip a mano y copiar el so conteníu nel direutoriu @dir@.', // L 'label_activer' => 'Activar', 'label_obligatoire' => 'Testu obligatoriu', // N 'nom_table_manquant' => 'Falta\'l nome de la tabla SQL', 'nouveau' => 'Nuevu', // O 'ok' => 'Val', // P 'pas_de_champs_dans' => 'Nun s\'alcontró dengún campu en @nom@', 'pas_de_changement' => 'Ensin cambéos en @nom@', // R 'refus_configuration_administrateur' => 'Namái los(es) alministradores del sitiu tienen permisu pa modificar estos parámetros.', 'refus_configuration_webmestre' => 'Sólo los webmasters d\'esti sitiu tienen autorización pa camudar estos parámetros.', 'reset' => 'Desaniciar', // S 'supprimer' => 'Tornar a los valores predeterminaos' ); ?> lang/cfg_en.php000066600000004411151452626520007433 0ustar00 'Delete', 'bouton_mettre_a_jour' => 'Update', 'bouton_reset' => 'Reset', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Choose the module to configure.', 'config_enregistree' => '@nom@ has been saved', 'config_supprimee' => '@nom@ has been deleted', 'configuration_modules' => 'Module configuration', // E 'erreur_copie_fichier' => 'It is impossible to copy the file @fichier@ to the target directory', 'erreur_enregistrement' => 'An error occurred while saving @nom@', 'erreur_lecture' => 'Cannot read @nom@', 'erreur_open_w_fichier' => 'Impossible to write to @fichier@', 'erreur_suppression' => 'An error occurred while deleting @nom@', 'erreur_suppression_fichier' => 'The file @fichier@ cannot be deleted.', 'erreur_type_id' => 'The field @champ@ must begin with a letter or an underscore', 'erreur_type_idnum' => 'The field @champ@ must be numeric', 'erreur_type_pwd' => 'The field @champ@ must contain more than 5 characters', // I 'id_manquant' => 'Missing identifier', 'installation_librairies' => 'Download libraries', 'installation_liste_libs' => 'List of libraries', 'installer_dossier_lib' => 'You must create a directory named @dir@ with write permissions at the root of your SPIP site.', 'installer_lib_192' => 'To install a library, unzip the archive manually and copy its contents to the @dir@ directory.', // L 'label_activer' => 'Activate', 'label_obligatoire' => 'Required entry', // N 'nom_table_manquant' => 'Missing SQL table name', 'nouveau' => 'New', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'No field found in @nom@', 'pas_de_changement' => 'No change found in @nom@', // R 'refus_configuration_administrateur' => 'Only the site administrators are authorised to change these parameters.', 'refus_configuration_webmestre' => 'Only the site webmasters are authorised to modify these parameters.', 'reset' => 'Delete', // S 'supprimer' => 'Reset to the default values' ); ?> lang/cfg_ar.php000066600000005143151452626520007436 0ustar00 'حذف', 'bouton_mettre_a_jour' => 'تحديث', 'bouton_reset' => 'تأصيل', // C 'cfg' => 'محرك الاعداد (CFG)', 'choisir_module_a_configurer' => 'اختر الملحق الذي تريد إعداده', 'config_enregistree' => 'تم تسجيل @nom@', 'config_supprimee' => 'تم حذف @nom@', 'configuration_modules' => 'إعداد الملاحق', // E 'erreur_copie_fichier' => 'لا يمكن نسخ الملف @fichier@ الى موقعه النهائي', 'erreur_enregistrement' => 'حصل خطأ خلال تسجيل @nom@', 'erreur_lecture' => 'لا يمكن قراءة @nom@', 'erreur_open_w_fichier' => 'لا يمكن فتح الملف @fichier@ في وضعية الكتابة', 'erreur_suppression' => 'حصل خطأ لدى حذف @nom@', 'erreur_suppression_fichier' => 'لا يمكن حذف الملف @fichier@.', 'erreur_type_id' => 'يجب ان يبدأ الحقل @champ@ بحرف او خط', 'erreur_type_idnum' => 'يجب ان يكون الحقل @champ@ رقمي', 'erreur_type_pwd' => 'يجب ان يحتوي الحقل @champ@ على اكثر من خمسة احرف', // I 'id_manquant' => 'معرّف غير موجود', 'installation_librairies' => 'تحميل المكتبات', 'installation_liste_libs' => 'لائحة المكتبات', 'installer_dossier_lib' => 'يجب انشاء مجلد @dir@ في اصل موقع SPIP يملك امتيازات الكتابة.', 'installer_lib_192' => 'لتثبيت مكتبة ما، يجب ازالة ضغك ملف zip يدوياً ونسخ محتواه في مجلد @dir@.', // L 'label_activer' => 'تفعيل', 'label_obligatoire' => 'إدخال إجباري', // N 'nom_table_manquant' => 'اسم جدول SQL غير موجود', 'nouveau' => 'جديد', // O 'ok' => 'موافق', // P 'pas_de_champs_dans' => 'لم يتم العثور على اي حقل في @nom@', 'pas_de_changement' => 'لا تغييرات في @nom@', // R 'refus_configuration_administrateur' => 'وحدهم مدراء الموقع يمكنهم تعديل هذه الاعدادات.', 'refus_configuration_webmestre' => 'لا يحق الا لمسؤولي الموقع تعديل هذه الإعدادات', 'reset' => 'حذف', // S 'supprimer' => 'إعادة القيم الافتراضية' ); ?> lang/cfg_nl.php000066600000004734151452626520007452 0ustar00 'Verwijderen', 'bouton_mettre_a_jour' => 'Bijwerken', 'bouton_reset' => 'Reset', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Kiest de te configureren module.', 'config_enregistree' => 'Uitgevoerde registratie van @nom@', 'config_supprimee' => 'Afschaffing van @nom@ uitgevoerd ', 'configuration_modules' => 'Configuratie van de modules', // E 'erreur_copie_fichier' => 'Onmogelijk om het bestand @fichier@ aan zijn definitieve plaats tekopiëren', 'erreur_enregistrement' => 'Een fout is bij de registratie van voorgekomen @nom@', 'erreur_lecture' => 'Onmogelijk om te lezen @nom@', 'erreur_open_w_fichier' => 'Onmogelijk om het bestand @fichier@ in schrift te openen', 'erreur_suppression' => 'Een fout is bij de afschaffing van voorgekomen @nom@', 'erreur_suppression_fichier' => 'Onmogelijk om het bestand af te schaffen @fichier@.', 'erreur_type_id' => 'Het veld @champ@ moet met een brief of een beginnen onderstreept', 'erreur_type_idnum' => 'Het veld @champ@ moet numeriek zijn', 'erreur_type_pwd' => 'Het veld @champ@ moet meer dan 5 karakters hebben', // I 'id_manquant' => 'Ontbrekende identificatie', 'installation_librairies' => 'Download van boekhandels', 'installation_liste_libs' => 'Lijst van de boekhandels', 'installer_dossier_lib' => 'U moet een dossier @dir@ aan de wortel van uw SPIP creëren dat toestemmingen van schrift heeft.', 'installer_lib_192' => 'Om een boekhandel te plaatsen, décompressez manueel zip en kopiëert zijn inhoud in het dossier @dir@.', // L 'label_activer' => 'Activeren', 'label_obligatoire' => 'Verplicht beslag', // N 'nom_table_manquant' => 'Ontbrekende naam van de tafel SQL', 'nouveau' => 'Nieuw', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'Geen veld gevonden in @nom@', 'pas_de_changement' => 'Geen verandering in @nom@', // R 'refus_configuration_administrateur' => 'Enkel de beheerders van de plaats worden gemachtigd om deze parameters te wijzigen.', 'refus_configuration_webmestre' => 'Enkel webmestres van de plaats worden toegestaan om deze parameters te wijzigen.', 'reset' => 'Uitwissen', // S 'supprimer' => 'Vervang de standaardwaarden' ); ?> lang/cfg_sk.php000066600000004540151452626520007451 0ustar00 'Odstrániť', 'bouton_mettre_a_jour' => 'Aktualizovať', 'bouton_reset' => 'Obnoviť', // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Vyberte modul, ktorý chcete nastaviť.', 'config_enregistree' => '@nom@ bol uložený', 'config_supprimee' => '@nom@ bol odstránený', 'configuration_modules' => 'Nastavenie modulu', // E 'erreur_copie_fichier' => 'Súbor @fichier@ na nedá skopírovať do cieľového priečinka', 'erreur_enregistrement' => 'Pri ukladaní @nom@ nastala chyba', 'erreur_lecture' => '@nom@ sa nedá čítať', 'erreur_open_w_fichier' => 'Do súboru @fichier@ sa nedá zapisovať', 'erreur_suppression' => 'Pri odstraňovaní @nom@ nastala chyba', 'erreur_suppression_fichier' => 'Súbor @fichier@ sa nedá odstrániť.', 'erreur_type_id' => 'Pole @champ@ sa musí začínať písmenom alebo podčiarkovníkom', 'erreur_type_idnum' => 'Pole @champ@ musí byť číselné', 'erreur_type_pwd' => 'Pole @champ@ musí mať viac ako 5 znakov', // I 'id_manquant' => 'Chýba identifikátor', 'installation_librairies' => 'Stiahnuť knižnice', 'installation_liste_libs' => 'Zoznam knižníc', 'installer_dossier_lib' => 'Treba vytvoriť priečinok @dir@ s povolením zapisovať v koreňovom adresári vašej SPIP-stránky.', 'installer_lib_192' => 'Ak chcete nainštalovať knižnicu, manuálne rozbaľte súbor zip a jeho obsah skopírujte do priečinka @dir@.', // L 'label_activer' => 'Aktivovať', 'label_obligatoire' => 'Povinný údaj', // N 'nom_table_manquant' => 'Chýba názov tabuľky SQL', 'nouveau' => 'Nový', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => 'V @nom@ sa nenašli žiadne polia', 'pas_de_changement' => 'V @nom@ sa nenašla žiadna zmena', // R 'refus_configuration_administrateur' => 'Zmeniť tieto parametre sú oprávnení iba administrátori stránky.', 'refus_configuration_webmestre' => 'Upravovať tieto parametre sú oprávnení iba webmasteri stránky.', 'reset' => 'Odstrániť', // S 'supprimer' => 'Obnoviť na predvolené hodnoty' ); ?> lang/cfg_tr.php000066600000004557151452626520007471 0ustar00 'Effacer', # NEW 'bouton_mettre_a_jour' => 'Güncelle', 'bouton_reset' => 'Reset', # NEW // C 'cfg' => 'CFG', 'choisir_module_a_configurer' => 'Konfigüre edilecek modülü seçiniz.', 'config_enregistree' => '@nom@ kaydı gerçekleştirildi', 'config_supprimee' => '@nom@ silinmesi gerçekleştirildi', 'configuration_modules' => 'Modüllerin konfigürasyonu', // E 'erreur_copie_fichier' => '@fichier@ dosyası kalıcı yerine kopyalamak olanaksız', 'erreur_enregistrement' => '@nom@ kaydı esnasında bir hata oluştu', 'erreur_lecture' => '@nom@ okumak olanaksız', 'erreur_open_w_fichier' => '@fichier@ dosyasını yazma amaçlı açmak olanaksız', 'erreur_suppression' => '@nom@\'nin silinmesi esnasında hata oluştu', 'erreur_suppression_fichier' => '@fichier@ dosyasını silmek olanaksız.', 'erreur_type_id' => '@champ@ alanı bir harfle veya altçizgiyle başlamalı', 'erreur_type_idnum' => '@champ@ alanı sayısal olmalı', 'erreur_type_pwd' => '@champ@ alanı 5 karakterden uzun olmalı', // I 'id_manquant' => 'Tanımlayıcı eksik', 'installation_librairies' => 'Kütüphaneler indiriliyor', 'installation_liste_libs' => 'Kütüphane listesi', 'installer_dossier_lib' => 'SPIP\'inizin kök dizininde @dir@ isimli, yazma haklarına sahip bir dizin oluşturmalısınız.', 'installer_lib_192' => 'Bir kütüphane kurmak için zip dosyasını el ile açınız ve içeriğini @dir@ dizinine kopyalayınız.', // L 'label_activer' => 'Etkinleştir', 'label_obligatoire' => 'Giriş zorunlu', // N 'nom_table_manquant' => 'SQL tablosunun ismi eksik', 'nouveau' => 'Yeni', // O 'ok' => 'OK', // P 'pas_de_champs_dans' => '@nom@\'de hiçbir alan bulunamadı', # MODIF 'pas_de_changement' => '@nom@\'de değişiklik yok', // R 'refus_configuration_administrateur' => 'Bu parametreleri yalnız idareciler ("administrateur") değiştirebilir.', 'refus_configuration_webmestre' => 'Bu parametreleri yalnız site yöneticileri değiştirebilir.', 'reset' => 'Sil', // S 'supprimer' => 'Kaldır' # MODIF ); ?> action/crayons_config_store.php000066600000004037151452626520012771 0ustar00 'crayons_config_store_get_valeur', 'f_set_modifs' => 'crayons_config_store_set_modifs'); return crayons_store($options); } /** * recuperer la valeur de la config demandee * * @param mixed $content # inutilisé * @param Array $regs * @return Array */ function crayons_config_store_get_valeur($content, $regs) { list(,$crayon,$type,$modele,$id) = $regs; $config = cfg_crayon2config($modele); $val = lire_config($config); return array('config' => $val); } /** * sauver les modifications de configs * * @param Array $modifs * @param Array $return * @return Array */ function crayons_config_store_set_modifs($modifs, $return) { foreach ($modifs as $modif) { list($type, $modele, $id, $content, $wid) = $modif; $config = cfg_crayon2config($modele); ecrire_config($config, $content['config']); } return $return; } ?> cfg_fonctions.php000066600000020354151452626520010116 0ustar00code = 'lire_config(' . $arg . ',' . ($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')'; return $p; } } # CFG_CHEMIN /** * La balise CFG_CHEMIN retourne le chemin d'une image stockee * par cfg. * * cfg stocke : 'config/vue/champ.ext' (ce qu'affiche #CONFIG)
    * #cfg_chemin retourne l'adresse complete : 'IMG/config/vue/champ.ext' * * @param Object $p Arbre syntaxique du compilo * @return Object */ function balise_CFG_CHEMIN_dist($p) { if (!$arg = interprete_argument_balise(1,$p)) { $arg = "''"; } $sinon = interprete_argument_balise(2,$p); $p->code = '($l = lire_config(' . $arg . ',' . ($sinon && $sinon != "''" ? $sinon : 'null') . ')) ? _DIR_IMG . $l : null'; return $p; } /** * #EDIT_CONFIG : Pour jouer avec les Crayons et les configurations * * *
    * #CONFIG{plugin/casier/cle} *
    *
    * * @param $p * @return */ function balise_EDIT_CONFIG_dist($p) { $config = interprete_argument_balise(1,$p); $instance = interprete_argument_balise(2,$p); $instance = $instance ? $instance : "'0'"; $p->code = 'classe_config_crayon('.$config.', '.$instance.')'; $p->statut = 'php'; $p->interdire_scripts = false; return $p; } /** * Classe qui sera utilisé pour CFG dans le bloc éditable par Crayon * * @param string $config * @param string $instance * @return string */ function classe_config_crayon($config, $instance) { // pour n'avoir que des caracteres alphanumeriques, // on transforme "depot::plugin/casier/cle" en "depot___plugin__casier__cle" $config = cfg_config2crayon($config); // return 'crayon composant-'.$composant.'-'.$instance.' type_pinceau'; return 'crayon config-'.$config.'-'.$instance . ' type_config'; } /** * Outil de manipulation des classes * * @param string $config classe pour CFG * @return string classe pour Crayon */ function cfg_config2crayon($config) {return str_replace(array('::','/'), array('___','__'), $config);} /** * Outil de manipulation des classes * * @param string $crayon classe pour Crayon * @return string classe pour CFG */ function cfg_crayon2config($crayon) {return str_replace(array('___','__'), array('::','/'), $crayon);} /** * autorisation de configurer * * @param string $faire * @param string $type * @param string $id * @param string $qui * @param string $opt * @return boolean */ function autoriser_config_crayonner_dist($faire, $type, $id, $qui, $opt) { return autoriser('configurer', $type, $id, $qui, $opt); } /** * autorisation de crayonner * * @param string $faire * @param string $type * @param string $id * @param string $qui * @param string $opt * @return boolean */ function autoriser_config_modifier_dist($faire, $type, $id, $qui, $opt) { return autoriser('crayonner', $type, $id, $qui, $opt); } # CFG_ARBO /** * Affiche une arborescence du contenu d'un #CONFIG * * - #CFG_ARBO, * - #CFG_ARBO{ma_meta}, * - #CFG_ARBO{~toto}, * - #CFG_ARBO{ma_meta/mon_casier}, * - #CFG_ARBO{ma_table:mon_id/mon_champ} * * @param Object $p * @return Object */ function balise_CFG_ARBO_dist($p) { if (!$arg = interprete_argument_balise(1,$p)) { $arg = "''"; } $p->interdire_scripts = false; $p->code = 'cfg_affiche_arborescence(' . $arg . ')'; return $p; } /** * Fonction utilisée par le compilo pour {@see balise_CFG_ARBO_dist} : * affiche l'arborescence qui est calculée par {@see cfg_affiche_sous_arborescence} * * @param string $cfg nom de la table meta * @return string code html en sortie */ function cfg_affiche_arborescence($cfg='') { $sortie = ''; $hash = substr(md5(rand()*rand()),0,6); // integration du css // Suppression de cette inclusion des css arbo au profit d'une inclusion d'un fichier cfg.css dans le header prive // $sortie .= "\n"; // integration du js $sortie .= "\n"; $tableau = lire_config($cfg); if ($c = @unserialize($tableau)) $tableau = $c; if (empty($cfg)) $cfg = 'spip_meta'; // parcours des donnees $sortie .= "
    \n" . cfg_affiche_sous_arborescence($cfg, $tableau) . "\n
    \n"; return $sortie; } /** * Calcul récursif de l'arborescence des configurations * * @param string $nom nom de la table meta * @param Array $tableau configuration * @return string code html en sortie */ function cfg_affiche_sous_arborescence($nom, $tableau){ $sortie = "\n
    $nom
    \n"; $sortie .= "\n
      "; if (is_array($tableau)){ ksort($tableau); foreach ($tableau as $tab=>$val){ if (is_array($val)) $sortie .= "
    • " . cfg_affiche_sous_arborescence($tab, $val) . "
    • "; elseif (false !== $v = @unserialize($val)) $sortie .= "
    • " . cfg_affiche_sous_arborescence($tab, $v) . "
    • "; else $sortie .= "
    • $tab = " . htmlentities($val, ENT_COMPAT, $GLOBALS['meta']['charset']) ."
    • \n"; } } else { $sortie .= "
    • $nom = " . htmlentities($val, ENT_COMPAT, $GLOBALS['meta']['charset']) . "
    • "; } $sortie .= "
    \n"; return $sortie; } if (!function_exists('filtre_cle_dist')) { /** * Cette fonction retourne une valeur dans un tableau arborescent * en indiquant la cle souhaitee. On descend dans la profondeur de * l'arborescence du tableau par des slash. * Si on donne un chaine serialisee en entree a la place d'un tableau, * la fonction tente de la deserialiser. * * Exemples : * $x = array("a1"=>array("b1"=>array("c1"=>3), "b2"=>4), "a2"=>8); * filtre_cle_dist($x, "a2") = 8 * filtre_cle_dist($x, "a1") = array("b1"=>array("c1"=>3), "b2"=>4) * filtre_cle_dist($x, "a1/b2") = 4 * filtre_cle_dist($x, "a1/b1/c1") = 3 * * Depuis un squelette SPIP : [(#TABLEAU|cle{a1/b1/c1})] * * @param array/string $tab : tableau ou tableau serialise * @param string $chemin : chemin d'acces a une valeur du tableau tel que "cleA/cleB/cleC" * @param string $defaut : valeur a retourner par defaut, si la cle n'est pas trouvee * * @return la valeur correspondant a la cle demandee, $defaut sinon **/ function filtre_cle_dist($tab, $chemin, $defaut=null) { if (!$tab) { return $defaut; } if (!is_array($tab)) { if (!is_string($tab) or !$tab = @unserialize($tab) or !is_array($tab) ) { return $defaut; } } $position = &$tab; $chemins = explode('/', $chemin); foreach ($chemins as $cle) { if (!isset($position[$cle])) { return $defaut; } $position = $position[$cle]; } return $position; } } ?> changelog.txt000066600000040552151452626520007256 0ustar00v1.15.0 (17 04 2010) * filtre |cle : #TABLEAU|cle{a/b/c, valeur par defaut} * (experimental) #FORMULAIRE_CONFIGURER{xx} cree un formulaire pour CFG en chargeant le contenu de "configurer/form_xx.html". Ce fichier peut contenir uniquement les parametres du CFG et des saisies. v1.14.0 (26 07 2009) * (experimental) balise #EDIT_CONFIG{ma/config} pour permettre des editions de config avec le plugin Crayons v1.13.0 (16 07 2009) * Suppression de #SAISIE et des saisies de CFG * Deplacement de celles ci dans le plugin "saisies" v1.12.5 (27 05 2009) * (en test) introduction d'une saisie : 'checkbox' v1.12.4 (19 05 2009) * (en test) introduction d'une saisie : 'groupe_mots' v1.12.3 (04 05 2009) * (en test) introduction de deux nouvelles saisies : 'selection' et 'radio' v1.12.1 (26 04 2009) * (en test) introduction d'une syntaxe raccourcie pour #SAISIE : #SAISIE{type,name,obligatoire} ce qui donne : #SAISIE{input,ville} ou #SAISIE{input,ville,oui}. Ce dernier est equivalent a : #SAISIE{input}{nom=ville}{obligatoire=oui}, lui meme equivalent a #INCLURE{fond=saisies/_base}{type_saisie=input}{erreurs}{nom=ville}{valeur=#ENV{ville}} v1.12 (25 04 2009) * (en test) les saisies/ sont modifies, elles passent toutes par le fichier saisies/_base et sont appelees par #SAISIE{input}{nom=ville} qui passe automatiquement les parametre : {erreurs}, {valeur=#ENV{ville}}, {fond=saisies/_base} et {type_saisie=input} puis charge la balise #INCLURE v1.11 (15 04 2009) * (en test) Ajout d'un dossier saisies/ pour faciliter l'ajout de champ facon SPIP 2.0 dans CFG. Les inclusions disposent de parametres pour les utiliser qui sont expliques dans leurs fichiers respectifs. Note d'avenir : * La future version majeure de CFG (CFG 2.0) ne fonctionnera par defaut qu'avec l'ecriture de formulaires facon SPIP 2.0, c'est a dire utilisant l'ecriture HTML des formulaires CVT/SPIP et s'appuyant sur les points d'entrees de CVT pour fonctionner. Il est donc fortement conseille d'ecrire ou de migrer ses formulaires CFG en respectant cela. Cela correspond avec cette version de CFG à ecrire ses formulaires dans formulaires/config_xxx.html et de ne mettre dans fonds/cfg_xxx.html qu'un appel à ce formulaire par
    #FORMULAIRE_CONFIG_XXX
    v1.10.5 (09 12 2008) * ajout des filtres et, ou, xou, non, oui pour compat 1.9.2 * ajout du filtre push pour compat 1.9.2 v1.10.3 (14 09 2008) * ne pas prendre le traiter() de CFG si c'est un formulaire CVT normal ! v1.10.2 (02 09 2008) - petites simplifications : * lire,ecrire,effacer_config() ne peuvent plus etre surchargees (suppression de inc_lire_config_dist et consoeurs) * les types de validation des champs de formulaires passes par css recoivent le même argument que les autres classes css (nom du champ + instance de la classe cfg_formulaire) et introduction d'une fonction ajouter_erreur($champ,$message) dans la classe cfg_formulaire pour faciliter cela. * permettre des fonctions d'extension pour toutes les actions pour un formulaire particulier, et pas uniquement verifier et post_traiter. function cfg_{nom_fichier/vue}_{action}(&$cfg){... actions ...} Au passage, changement d'api pour le test de verifier, qui comme les autres maintenant recoit l'instance de la classe cfg_formulaire : function cfg_{nom_fichier/vue}_{action}(&$cfg), mais son retour doit sauvegarder les valeurs d'erreurs dans cfg (et non les retourner) en utilisant la fonction $cfg->ajouter_erreurs($erreurs); (compatibilité ascendente assurée cependant quelques temps) * CFG/CVT : transmission de l'instance de classe cfg_formulaire entre la fonction verifier() et traiter() du CVT pour eviter les recalculs des parametres et une reverification dans traiter(). v1.10.1 - un echo de debug trainait v1.10.0 - corrections pour palette, changement de version pour marquer le changement de compat (necessite Palette pour les couleurs) v1.9.8 (01 08 2008) - usage du plugin Palette pour permettre la mutualisation de la librairie farbtastic entre plugins v1.9.7 (30 07 2008) - si on ne trouve pas de fichier au nom du fond, on n'essaie pas de le compiler... v1.9.6 (23 07 2008) - Suivre la svn de SPIP : le formulaire CVT charger() change la signature de son retour. v1.9.5 (23 07 2008) - On introduit (sert notamment au selecteur de couleur, pour l'avoir aussi en cvt.) - On introduit la possibilite de faire des actions 'post_traiter' simplement depuis un nom de formulaire : si un formulaire cfg possede une fonction 'cfg_{nom}_post_traiter(&$cfg)', elle sera appelee apres le traitement par CFG, en lui transmettant la classe php $cfg. - Ne pas utiliser le parseur CFG sur les formulaires dynamiques qui ont une fonction _stat() (et non une fonction _charger() v1.9.4 (17 07 2008) - ajout de compat 1.9.2 pour sql_allfetsel() v1.9.3 (16 07 2008) - Permettre d'ajouter des #FORMULAIRE_XX dans des fonds/cfg_yy.html - introduction d'un parametre interpreter. Si alors le fonds/cfg_yy.html ne cherche pas a recuperer les champs du formulaire en scannant le code compile. Ainsi, il est possible de creer des fonds de configuration cfg en appelant des #FORMULAIRE_XX. Le fond ne prendra pas à tord des parametres du/des #FORMULAIRE inclus. Par contre, un tel fond ne peut pas avoir de formulaire CFG classique en même temps (on ne peut melanger) ;Mais un fond de ce type peut appeler plusieurs #FORMULAIRE differents. Les parametres continuent d'etre lus, ce qui permet d'indiquer des liens, des autorisations ou autre parametre comme le font normalement les fonds CFG. v1.9.2 (14 07 2008) - Corrections depots tablepack et table qui testaient leurs parametres un peu trop tot, ce qui effacait parfois les valeurs par defaut, apres coup. v1.9.1 (14 07 2008) - Correction depot tablepack qui oubliait de prendre en compte le nom du formulaire dans l'enregistrement depuis v1.8.2. v1.9.0 (14 07 2008) - Lorsqu'un formulaire SPIP 2 / CVT n'a pas de fonction charger(), ce sont les fonctions Charger, Verifier et Traiter de CFG qui sont utilisees pour ce formulaire. Cela permet des #FORMULAIRE_XX ou XX est un formulaire CFG/CVT formulaires/xx.html. Il peut ainsi y avoir des formulaires CFG public/prive, ajax ou non (et qui fonctionnent !). Differences entre un fonds/cfg_xx.html et formulaires/xx.html : * les fonds/ s'affichent dans ?exec=cfg, pas les formulaires/ * les fonds/ ont [(#ENV{_cfg_}|form_hidden)], pas les formulaires/ * en revanche, les formulaires ont #ACTION_FORMULAIRE{#SELF}, pas les fonds/ - Correction du preg_files() sur les fonds/ pour ne prendre reellement que des fichiers commencant par 'cfg_' (et non aussi le contenu d'un dossier commencant par cfg_) - Deplacements des exemples de fonds cfg dans le plugin cfg_exemples - la syntaxe #FORMULAIRE_CFG{xx} disparait au profit de #FORMULAIRE_XX - si le parametre alors, on autorise. S'il est egal a non, alors on n'autorise pas. Permet d'ecrire : les syntaxes continuent de fonctionner. v1.8.2 (07 07 2008) - Corection d'un bug sur le depot tablepack avec effacer_config(). - tests unitaires pour le depot tablepack v1.8.1 (06 07 2008) - Correction bug introduit en 1.8.0 d'erreur de lecture si aucune valeur n'etait encore enregistrees dans une depot metapack ou php. v1.8.0 (04 07 2008) - Simplifier *_config() en se passant de la classe cfg_params() - les fonctions des balises sont chargées au calcul et non en permanence et sont deplacees dans cfg_fonctions.php - suppression de cfg_charger_classe() : la surchage, c'est simplement le fichier, on se passe de _dist - déplacemeent de la classe cfg_depot dans inc/cfg_config - tests unitaires pour les fonctions lire_config, ecrire_config et effacer_config pour les dépots meta, metapack et php - lire_config metapack et php ne renvoyaient pas NULL si la méta ou le fichier php etait absent - CFG ne supporte plus l'écriture (hack) #CONFIG{expression,'',''}, à remplacer par #CONFIG{expression,#ARRAY} v1.7.6 (27 06 2008) - Correction bug avec ecrire_config(php::...) v1.7.5 (26 05 2008) - Corrections de la librairie sql_* pour 1.9.2 v1.7.4 (08 05 2008) - Ne pas lister tous les formulaires cfg dans la page de gestion de plugin, mais seulement ceux avec l'onglet sur "oui" v1.7.3 (23 04 2008) - correction compat sql_showtable() sur 1.9.2 (fil) - suivi svn pour les formulaires dynamiques (necessitent 'action') (les formululaires #FORMULAIRE_CFG fonctionnent maintenant aussi dans le prive) v1.7.2 (16 04 2008) - mettre sql_count() et sql_selectdb() dans les fonctions de compatibilite ceci pour d'autres plugins souhaitant eventuellement les utiliser en 1.9.2 v1.7.1 (07 04 2008) - correction bug sur effacer_config(metapack::xx) v1.7.0 (05 04 2008) - installation de librairies via la page ?exec=cfg_install_libs, presque automatique en 1.9.3 - les librairies installables sont definies dans une globale $cfg_libs (cf. cfg_options.php) - internationalisation types et installation de libs v1.6.5 (05 04 2008) - effectivement passer dans l'environnement 'message_erreur', 'message_ok' et 'erreurs' - eviter que #ACTION_FORMULAIRE affiche son contenu en 1.9.2 v1.6.4 (05 04 2008) - les classes css des champs sont toutes analysees. Elles doivent etre placees juste apres name="...". - si une classe css 'cfg_couleur' est presente et si la librairie 'farbtastic' est installee, une pipette sera proposee pour selectionner la couleur. exemple : v1.6.3 (04 04 2008) - utiliser les points d'entrees de cfg pour definir des actions sur les parametres et application avec le parametre 'rediriger' v1.6.2 (04 04 2008) - eviter double INSERT HEAD sous 1.9.2 v1.6.1 (02 04 2008) - retrouver le fonctionnement d'avant v1.4.10 sur #CONFIG{meta} ET lire_config{meta}. Cette derniere deserialise une meta de spip par defaut, contrairement a la premiere. v1.6.0 (02 04 2008) - introduire la prise en compte des mal raffraichis v1.5.0 (30 03 2008) - nettoyages, suppression de la gestion de l'ancienne api des depots - retour du fonctionnement en php4 casse pendant la migration des depots - correction petit bug si $GLOBALS['meta']['nom'] est un array() v1.4.12 (30 03 2008) - depot 'table', c'etait le dernier... - corrections bugs sur #cfg_arbo, #config et sur la fonction $this->monter_arbre() v1.4.11 (30 03 2008) - corrections bugs sur 'cfg_id' modifie parfois a tord par new_id, - rangements dans les classes depots, et retour de messages depuis les depots possible - depot 'tablepack' en nouvelle api v1.4.10 (29 03 2008) - corrections bugs sur : #CONFIG et |in_array{#CONFIG{nom,'',''}} (preferer #CONFIG{nom/,#ARRAY}) - ecrire_config() n'a plus le parametre 'serialize', par defaut : ecrire_config('nom',$valeur) ne serialise pas (comme une meta classique) alors que : ecrire_config('nom/',$valeur) ou ecrire_config('nom/champ',$valeur) va serialiser dans spip_meta - si l'on passe le nom du depot, c'est lui qui gere la serialisation ou non des donnees : ecrire_config('meta::nom',$valeur) ne serialise pas ecrire_config('metapack::nom',$valeur) serialise (pas besoin du /) v1.4.9 (28 03 2008) - depot 'metapack' en nouvelle api v1.4.8 (27 03 2008) - depot 'php' en nouvelle api (on commence par le plus simple !) - suivi svn pour api formulaires : charger/verifier/traiter v1.4.7 (26 03 2008) - corrections bugs sur les champs multiples et les tables - renommages de variables et doc - retour de 'cfg_id' dans #ENV v1.4.6 (26 03 2008) - deplacement des affichages dans l'exec plutot que dans la classe cfg (fin) - correction bug sur le chargement des depots dans les fonctions lire_config qui transformaient un array en "array" - API pour les fichiers de depots lire(), ecrire() et effacer() qui retournent array($ok, array("nom"=>"val")) (ancienne api toujours fonctionnelle [lire() et modifier($supprimer)], les depots autres que 'meta' seront portes vers la nouvelle api) v1.4.5 (25 03 2008) - deplacement des affichages dans l'exec plutot que dans la classe cfg - correction bug en 1.9.2 (il ne faut pas passer "editable" dans le contexte d'un recuperer_fond() !) v1.4.4 (24 03 2008) - naissance de l'indépendance du depot 'meta' - lire/ecrire/effacer_config utilisent le depot meta v1.4.3 (23 03 2008) - permettre la surcharge de lire_config, ecrire_config et effacer_config (a travers les fonctions inc_lire_config_dist()) - permettre la surcharge des classes 'cfg','cfg_formulaire','cfg_params','cfg_depot'. - uniformiser un peu les messages d'erreur entre cfg et les formulaires dynamiques v1.4.2 (23 03 2008) - deplacement des storage cfg (maintenant appeles 'depot') dans inc/depot/nom.php - renommage du depot 'classic' en 'meta', suppression du depot 'extrapack' au profit de tablepack + colonne v1.4.1 (23 03 2008) - deplacement des parametres de cfg dans une seule entree $this->param v1.4.0 (22 03 2008) - #FORMULAIRE_CFG{nom_du_cfg} fonctionnant avec la nouvelle API des formulaires dynamiques (1.9.3dev) - quelques changements dans les noms de fonctions, suppression des anciens #formulaire_cfg - théoriquement pas de rupture de compatibilité - déplacement de l'icone cfg dans le sous menu 'configuration' (et non dans l'onglet du meme nom) v1.3.8 (25.02.2008) - correction bug introduit en 1.3.7 (doublement des liens) v1.3.7 (24.02.2008) - nouvelle option qui permet d'ajouter du contenu dans le head de l'espace privé lorsque le fond en question est actif. - bien supprimer les parametres CFG du code html rendu v1.3.6 (24.02.2008) - les onglets s'enrichissent d'une nouvelle syntaxe. Il existait qui n'affichait pas l'onglet, il y a maintenant qui n'affiche pas l'onglet, mais va "exposer" le fond choisi si le fond courant est actif. (Il faut que le fond choisi ait son onglet visible par contre - ie: onglet=oui ou non renseigne) - Dans un fond cfg, si un lien pointe sur le fond en cours, la balise ne sera pas mise v1.3.5 (24.02.2008) - les liens s'enrichissent d'une nouvelle syntaxe permettant de mettre des chaines de langue sur les liens directement avec celles du plugin dans /lang/prefixe_plugin_fr.php v1.3.4 - oubli qui empechaient les liens de fonctionner v1.3.3 (07.02.2008) : - Si un lien est demande dans le fond mais que fonds/cfg_toto.html n'existe pas, le lien n'est pas propose v1.3.2 (02.02.2008) : - correction de bug sur storage table : l'insertions de nouvelles entrees était impossible sous SQLite. Test Ok en mysql, pg, sqlite3 v1.3.1 : - correction coquille - introduction d'un paramètres à CFG pour lui dire de ne pas afficher les messages renvoyés par CFG habituellement v1.3 : - introduction de liens_multi - correction d'un bug avec les liens multis qui ne sont plus définis automatiquement par le parametre liens, mais par un parametre specifique : liens_multi v1.2 : - corrections bugs sur #FORMULAIRE_CFG - homogeneise le passage de paramètres à CFG depuis un fond en utilisant uniquement (l'autre écriture [(#REM) param=valeur] est decpeciee. - fourni des fonctions pour écrire et modifier les contenus arborescents generes par CFG (storage meta et extra uniquement) : ecrire_config() et effacer_config(). - toutes les chaînes de langues sont maintenant regroupées dans le fichier lang/cfg_fr.php et attendent des traductions/traducteurs. v1.1 : - fourni une balise #FORMULAIRE_CFG pour l’affichage d’un formulaire CFG dans un squelette (nécessite SPIP > 1.9.2) v1.0.10 : - ajout de #CFG_ARBO v1 : - storages meta, extra, table, classic, php cfg_pipeline.php000066600000016403151452626520007721 0ustar00sousmenu['cfg']= new Bouton( _DIR_PLUGIN_CFG.$icone, // icone _T('cfg:CFG')); } return $flux; } /** * Rajoute à gauche de la page d'admin des plugins un lien vers * la page de CFG * * @param Array $flux * @return Array */ function cfg_affiche_gauche($flux){ if ($flux['args']['exec']=='admin_plugin'){ $flux['data'] = debut_cadre_enfonce('',true) . icone_horizontale('CFG – '._T('configuration'), generer_url_ecrire('cfg'), _DIR_PLUGIN_CFG.'cfg-22.png', '', false) . fin_cadre_enfonce(true) . $flux['data']; } return $flux; } /** * Gerer l'option des fonds CFG * uniquement dans le prive * * @param Array $flux * @return Array */ function cfg_header_prive($flux){ if (!_request('cfg') || (!_request('exec') == 'cfg')) { return $flux; } // Ajout des css de cfg $flux .= ''; include_spip('inc/filtres'); include_spip('inc/cfg_formulaire'); $config = new cfg_formulaire( sinon(_request('cfg'), ''), sinon(_request('cfg_id'),'')); if ($config->param['head']) $flux .= "\n".$config->param['head']; return $flux; } /** * CSS à ajouter lors du #INSERT_HEAD * * @param Array $flux * @return Array */ function cfg_insert_head_css($flux){ // Ajout des css de cfg static $done = false; if (!$done) { $done = true; if (_INSERT_HEAD_CFG) $flux .= ''; } return $flux; } /** * CSS à ajouter lors du #INSERT_HEAD_CSS * * @param Array $flux * @return Array */ function cfg_insert_head($flux){ $flux = cfg_insert_head_css($flux); // au cas ou il n'est pas implemente return $flux; } /** * teste si $form n'est pas un formulaire CVT deja existant * (et non un formulaire CFG nomme $form en CVT) * * #FORMULAIRE_TOTO <> #FORMULAIRE_CFG{toto} * * @param string $form Nom du formulaire * @return boolean TRUE si formulaire_$form est un CVT deja existant */ function est_cvt($form){ $f = 'formulaires_' . $form; return (function_exists($f . '_stat') OR function_exists($f . '_charger_dist') OR function_exists($f . '_charger') OR function_exists($f . '_verifier_dist') OR function_exists($f . '_verifier') OR function_exists($f . '_traiter_dist') OR function_exists($f . '_traiter') ); } /** * Formulaires CFG CVT : Charger * * @param Array $flux * @return Array */ function cfg_formulaire_charger($flux){ // s'il n'y a pas de fonction charger, on utilise le parseur de CFG $form = $flux['args']['form']; if (!est_cvt($form) AND !count($flux['data'])){ // ici, on a le nom du fond cfg... // on recupere donc les parametres du formulaire. include_spip('inc/cfg_formulaire'); #$config = &new cfg_formulaire($cfg, $cfg_id); $cfg_id = isset($flux['args']['args'][0]) ? $flux['args']['args'][0] : ''; $config = new cfg_formulaire($form, $cfg_id); $valeurs = array( '_cfg_fond' => 'formulaires/'.$form, '_cfg_nom' => $form, 'id' => $cfg_id, '_param' => $config->param, // passer aussi les arguments spécifiques a cfg '_cfg_' => $config->creer_hash_cfg(), // passer action=cfg pour avoir un hash formulaire correct '_hidden' => "" ); // il faut passer les noms des champs (input et consoeurs) de CFG dans l'environnement // pour pouvoir faire #ENV{nom_du_champ} if (is_array($config->val)){ foreach($config->val as $nom=>$val){ $valeurs[$nom] = $val; } } if (!$config->autoriser()) { $valeurs['editable'] = false; } else { $valeurs['editable'] = true; } $valeurs['_pipeline'] = array('editer_contenu_formulaire_cfg', 'args'=>array( 'nom'=>$form, 'contexte'=>$valeurs, 'ajouter'=>$config->param['inline']) ); $flux['data'] = $valeurs; // return $valeurs; // retourner simplement les valeurs #return array(true,$valeurs); // forcer l'etat editable du formulaire et retourner les valeurs } return $flux; } /** * Formulaires CFG CVT : Vérifier * * @param Array $flux * @return Array */ function cfg_formulaire_verifier($flux){ $form = $flux['args']['form']; if (_request('_cfg_is_cfg') AND !est_cvt($form)){ include_spip('inc/cfg_formulaire'); #$config = &new cfg_formulaire($cfg, $cfg_id); $cfg_id = isset($flux['args']['args'][0]) ? $flux['args']['args'][0] : ''; $config = new cfg_formulaire($form, $cfg_id); $err = array(); if (!$config->verifier() && $e = $config->messages){ if (isset($e['message_refus'])) { $err['message_erreur'] = $e['message_refus']; } else { if (count($e['erreurs'])) $err = $e['erreurs']; if (count($e['message_erreur'])) $err['message_erreur'] = join('
    ',$e['message_erreur']); if (count($e['message_ok'])) $err['message_ok'] = join('
    ',$e['message_ok']); } } $flux['data'] = $err; // si c'est vide, modifier sera appele, sinon le formulaire sera resoumis // a ce moment la, on transmet $config pour eviter de le recreer // juste ensuite (et de refaire les analyse et la validation) if (!$err) cfg_instancier($config); } return $flux; } /** * sauve ou redonne une instance de la classe cfg. * sert a transmettre $config entre verifier() et traiter() * car $flux le perd en cours de route si on lui donne... * * @staticvar boolean|Object $cfg * @param boolean|Object $config $config est de type cfg_formulaire * @return boolean|Object */ function cfg_instancier($config=false){ static $cfg=false; if (!$config) return $cfg; return $cfg = $config; } /** * Formulaires CFG CVT : Traiter * * @param $flux * @return */ function cfg_formulaire_traiter($flux){ $form = $flux['args']['form']; if (_request('_cfg_is_cfg') AND !est_cvt($form)){ $config = cfg_instancier(); $config->traiter(); $message = join('
    ',$config->messages['message_ok']); $redirect = $config->messages['redirect']; $flux['data'] = array('editable'=>true,'message_ok' => $message,'redirect' => $redirect); // forcer l'etat editable du formulaire et retourner le message } return $flux; } /** * pipeline sur l'affichage du contenu * pour supprimer les parametres CFG du formulaire * * @param Array $flux * @return Array */ function cfg_editer_contenu_formulaire_cfg($flux){ $flux['data'] = preg_replace('/(/sim', '', $flux['data']); $flux['data'] .= $flux['args']['ajouter']; return $flux; } ?> todo.txt000066600000002723151452626520006272 0ustar00Todo ou idées : - rupture de compatibilité pour simplifier l'API de CFG et réduire son domaine d'action (essayer en même temps de faire un plugin 'cfg_etendu' afin de limiter la casse) - Supprimer (?) tout ce qui permet de créer/actionner des paramètres, ainsi que les actions en fonction de css particulières sur les champs. Mettre cela (?) dans un plugin CFG_etendu. Ca concerne : * les paramètres 'rediriger' et 'selecteur_couleur' (ce dernier est réglé avec le plugin palette) * les classes 'cfg_couleur' (réglé), 'cfg_fichier' (upload de fichier) et 'cfg_id' * les types pour mettre des erreurs standard - 'redigiriger' n'est employé que par autorité... - 'cfg_fichier' et 'cfg_id' sont problématiques. - ne plus utiliser 'head' qui pompe de la mémoire à cfg pour mettre un header : demander à utiliser les pipelines de SPIP pour cela, car ça ne fonctionne pas avec les formulaires CFG en CVT. C'est un vaste problème, plus général dans SPIP d'ailleurs, de ne pouvoir ajouter facilement depuis un squelette quelque chose dans le head La solution actuelle pour CFG fonctionne (sauf en CVT), mais compile 2 fois le formulaire (1 fois dans le pipeline insert_head, une fois lors de l'execution...). C'est donc une fois de trop. - les types d'erreurs type_xx : Ces type_xx sont utilisés dans certains plugins, mais est-ce nécessaire de faire un fichier par type ? avec des find_in_path qui echouent ? cfg.png000066600000020425151452626520006030 0ustar00PNG  IHDR@@iq pHYs$$P$ OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F@IDATx{pc}?{|I\ʒVTDi*tIdO⤵v&qm<k!ŲkUR+W#K]\.? rArwm93q/CC~~pyl2#Iw_w~SO|X_}W4@<,21/^{ubWT੓wpᇅtN|^>}3%?X솵6vM66knGF+Iᚅd1)k2v,Յ)$OYrK%uwkoGzuQ*R4%Yb)O%Vwa㵵!ҚLh kvač "heBi,%C)_Su${Py$%/W*ӻk'A<<1X"'ư29Ietstu1g76Fwbxյ,% 1v!07"B^xX3}Py>bi^d`zP+P"N{;Lľ}}t-.s ejhpRz ?; Z#=odjDUO뮻~$|س"&G涳H,NS?X(0cZArH; ɅEFQIk33z!b>8Ϛk[g[k-,mx3L"x|CٷCF[t08 I" f-7R)8I5Fe/?WH!Z.oU֋ܬc +g,,qYH<m:mSdDV5FC7HQkV5R)A ^_Js 6c 242V!q "V(C0ק4ƘM-0pk%Y(0wΟ8 !Bx==:E,FTk8 I0YXlO:3gX9{S -.X{T6 Fien (P&BV7Y7c|]i O=AH1G |aj5Tj-z~_UFqR)zv D{`7@#{k1heڠY㖣\Lmb)zk8ZύPܟE~,z'~{CQ$ HkI=B_PFcA$*Zs1AwӖꢣ0rg'ӹTd)cnc1¤^wຠ5ݳs rdf(YaGXLbPX>R ˸ wČ!vD:D !xq_XAzZ5gQRb K$J1,@6d]2ʫorW.O뺸' .$Xr'FUr9qRq?!_eıcر1߀ V1JZu5Rr]ꋋrq}{) 4mI\Ӛ22G.E[@86@.$Q`>&AF(kP֢+a0"C "C˗qNݍsP@ܻc5f~S.c+LQbuC)놮S UYVM5`u:~]~\)kָ rX|Q45&JFLhTK%?IBOLN 8VY_PzD5ճD"GP.SO$kjJQT_tiy_ܵJaRW'K}iFӽ@vr eJTyji %6ZJdњkgJo$\fcD%5U{mɮ.,P_^C[Nb<=LA!C* n l#"tپ>G77rt7ϢWV Q;GwKF?CCa)}S?G<ڑON2Gz^H|TֶJ؁UX!8{ۭ!S3Rk(*t7kEQ]hJgEkvgAG1m-T@ǩ7(~S9/1oh+b+>Ri&$OIj5!AG!瞣rM硴ƏFt,JD1Z QC(} ߏck$@VՒΪ\$oQwO T( Zt[!#,,q9qx)gfP]"@{^b%ιSw]_~?O fguÈ"YA ׻poK/Q|I^?0̹'⎗_=8p"Ӄ;B 66↲iws]2H8;/{In}d_;M׃#W;AX!R"zzppٳ/PWzwKJ)xl,SCC#6W1@pjw?,}'Wb>/н?o'v'{>jrGeq| o^= r˯ҥ5m$z1fo Xju靝c`z0"Hx3ttp{4E"ىގ_Gˬ,,Pr$\>4Xh/9iڃ74"=\L.MI}?ހ0F"n-B @+E( pAx G)B6hF"my<?xQ*q5!ASŋ Nϐq<)% kc69 h^osv$݅W'@ЎUAi벐ɰߏq aD'nn ~v }G/245M[ P׋aB \88i*!"Zoư"%3w1~ & nZ#=~[87{L A٬)-gRs^h5 h@t$Ѝ]& Ć{bVog)U!  a6 nLsa=R4FWXt_mn njo"[]-7\ m#@fnwFk-El&YgG%vƼ&A oކV@4|]onƶ*c-baͽM7 D=%n4rno5hqne 67ܻ)k}=\/v`oъ<a=/> ko"7~Q\j5IENDB`depots/meta.php000066600000005520151452626520007517 0ustar00array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * version du depot * @var int */ var $version = 2; /** * * @param Array $params */ function cfg_depot_meta($params=array()) { foreach ($params as $o=>$v) { $this->$o = $v; } } /** * recuperer les valeurs. * * unserialize : si la valeur est deserialisable, elle est retournee deserialisee * permet a #CONFIG d'obtenir une valeur non deserialisee... * * @param boolean $unserialize * @return Array */ function lire($unserialize=true) { $val = array(); if ($this->champs) { foreach ($this->champs as $name => $def) { // pour compat cfg, si la meta est deserialisable, la retourner deserialisee if ($unserialize && ($a = @unserialize($GLOBALS['meta'][$name]))) $val[$name] = $a; else { $val[$name] = $GLOBALS['meta'][$name]; } } // si pas d'argument, retourner comme le core serialize($GLOBALS['meta']) } else { $val = serialize($GLOBALS['meta']); } return array(true, $val); } /** * ecrit chaque enregistrement de meta pour chaque champ * * @return Array */ function ecrire() { foreach ($this->champs as $name => $def) { ecrire_meta($name, $this->val[$name]); } if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, $this->val); } /** * supprime chaque enregistrement de meta pour chaque champ * * @return Array */ function effacer(){ foreach ($this->champs as $name => $def) { if (!$this->val[$name]) { effacer_meta($name); } } if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, $this->val); } /** * charger les arguments de lire_config(meta::nom) * * @param string $args # $args = 'nom'; ici * @return boolean */ function charger_args($args){ if ($args) $this->champs = array($args=>true); return true; } } ?> depots/tablepack.php000066600000021652151452626520010523 0ustar00array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * Arbre * @var Array */ var $_arbre = array(); /** * Le WHERE permettant de retrouver l'Arbre * @var Array */ var $_id = array(); /** * Base de l'arbre * @var Array */ var $_base = null; /** * Où on est dans l'arbre $this->_arbre * @var &Array */ var $_ici = null; /** * version du depot * @var int */ var $version = 2; /** * Dépôt dans les attributs de la classe * * @param Array $params */ function cfg_depot_tablepack($params=array()) { foreach ($params as $o=>$v) { $this->$o = $v; } } /** * charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici) * * @param boolean $lire # inutilisé * @return */ function charger($lire = false){ if (!$this->param['colonne']) $this->param['colonne'] = 'cfg'; // colid : nom de la colonne primary key if ($this->param['table']) { list($this->param['table'], $colid) = $this->get_table_id($this->param['table']); // renseigner les liens id=valeur $id = explode('/',$this->param['cfg_id']); foreach ($colid as $n=>$c) { if (isset($id[$n])) { $this->_id[$c] = $id[$n]; } } } if (!$this->param['cfg_id']) { $this->messages['message_erreur'][] = _T('cfg:id_manquant'); return false; } // verifier que la colonne existe if (!$this->verifier_colonne()) { return false; } else { // recuperer la valeur du champ de la table sql $this->_where = array(); foreach ($this->_id as $nom => $id) { $this->_where[] = $nom . '=' . sql_quote($id); } $this->_base = ($d = sql_getfetsel($this->param['colonne'], $this->param['table'], $this->_where)) ? unserialize($d) : array(); } $this->_arbre = array(); $this->_ici = &$this->_base; $this->_ici = &$this->monte_arbre($this->_ici, $this->param['nom']); $this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']); return true; } /** * recuperer les valeurs. * * @return Array */ function lire() { // charger if (!$this->charger(true)){ return array(true, null); } $ici = &$this->_ici; // utile ?? if ($this->param['cfg_id']) { $cles = explode('/', $this->param['cfg_id']); foreach ($this->champs_id as $i => $name) { $ici[$name] = $cles[$i]; } } // s'il y a des champs demandes, ne retourner que ceux-ci if (count($this->champs)){ $val = array(); foreach ($this->champs as $name => $def) { $val[$name] = $ici[$name]; } $ici = $val; } return array(true, $ici); } /** * ecrit chaque enregistrement pour chaque champ. * * @return Array */ function ecrire() { // charger if (!$this->charger()){ return array(false, $this->val, $this->messages); } $ici = &$this->_ici; if ($this->champs){ foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; $ici[$name] = $this->val[$name]; } } else { $ici = $this->val; } $ok = sql_updateq($this->param['table'], array($this->param['colonne'] => serialize($this->_base)), $this->_where); return array($ok, $ici); } /** * supprime chaque enregistrement pour chaque champ. * * @return Array */ function effacer(){ // charger if (!$this->charger()){ return array(false, $this->val, $this->messages); } $ici = &$this->_ici; if ($this->champs){ foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; unset($ici[$name]); } } // supprimer les dossiers vides for ($i = count($this->_arbre); $i--; ) { if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) { break; } unset($this->_arbre[$i][0][$this->_arbre[$i][1]]); } $ok = sql_updateq($this->param['table'], array($this->param['colonne'] => serialize($this->_base)), $this->_where); return array($ok, array()); } /** * charger les arguments de * - lire_config(tablepack::table@colonne:id/nom/casier/champ) * - lire_config(tablepack::~id_auteur@colonne/chemin/champ) * - lire_config(tablepack::~@colonne/chemin/champ * * @param $args * @return */ function charger_args($args){ $args = explode('/',$args); // cas ~id_auteur/ if ($args[0][0] == '~'){ $table = 'spip_auteurs'; $colid = array('id_auteur'); list($auteur, $colonne) = explode('@',array_shift($args)); if (count($auteur)>1){ $id = substr($auteur,1); } else { $id = $GLOBALS['auteur_session'] ? $GLOBALS['auteur_session']['id_auteur'] : ''; } // cas table:id/ // peut etre table:id:id/ si la table a 2 cles } else { list($table, $id) = explode(':',array_shift($args),2); list($table, $colonne) = explode('@',$table); list($table, $colid) = $this->get_table_id($table); } $this->param['cfg_id'] = $id; $this->param['colonne'] = $colonne ? $colonne : 'cfg'; $this->param['table'] = $table ? $table : 'spip_auteurs'; if ($champ = array_pop($args)) { $this->champs = array($champ=>true); } $this->param['casier'] = implode('/',$args); // renseigner les liens id=valeur $id = explode(':',$id); foreach ($colid as $n=>$c) { if (isset($id[$n])) { $this->_id[$c] = $id[$n]; } } return true; } /** * se positionner dans le tableau arborescent * * @param $base * @param $chemin * @return */ function & monte_arbre(&$base, $chemin){ if (!$chemin) { return $base; } if (!is_array($chemin)) { $chemin = explode('/', $chemin); } if (!is_array($base)) { $base = array(); } foreach ($chemin as $dossier) { if (!isset($base[$dossier])) { $base[$dossier] = array(); } $this->_arbre[] = array(&$base, $dossier); $base = &$base[$dossier]; } return $base; } /** * * @param $creer * @return */ function verifier_colonne($creer = false) { if (!$this->param['table']) return false; $col = sql_showtable($table = $this->param['table']); if (!is_array($col['field']) OR !array_key_exists($colonne = $this->param['colonne'], $col['field'])) { if ($creer && $colonne && sql_alter('TABLE '.$this->param['table'] . ' ADD ' . $colonne . 'TEXT NOT NULL DEFAULT \'\'')) { return true; } return false; } return true; } /** * Cherche le vrai nom d'une table ainsi que ses cles primaires * * @param $table * @return */ function get_table_id($table) { static $catab = array( 'tables_principales' => 'base/serial', 'tables_auxiliaires' => 'base/auxiliaires', ); $try = array($table, 'spip_' . $table); foreach ($catab as $categ => $catinc) { include_spip($catinc); foreach ($try as $nom) { if (isset($GLOBALS[$categ][$nom])) { return array($nom, preg_split('/\s*,\s*/', $GLOBALS[$categ][$nom]['key']['PRIMARY KEY'])); } } } if ($try = table_objet($table)) { return array('spip_' . $try, array(id_table_objet($table))); } return array(false, false); } } ?> depots/table.php000066600000015127151452626520007664 0ustar00array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * Arbre * @var Array */ var $_arbre = array(); /** * Le WHERE permettant de retrouver l'Arbre * @var Array */ var $_id = array(); /** * Base de l'arbre * @var Array */ var $_base = null; /** * Où on est dans l'arbre $this->_arbre * @var &Array */ var $_ici = null; /** * version du depot * @var int */ var $version = 2; /** * Dépôt dans les attributs de la classe * * @param Array $params */ function cfg_depot_table($params=array()){ foreach ($params as $o=>$v) { $this->$o = $v; } } /** * charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici) * * @param boolean $creer # inutilisé */ function charger($creer = false){ if (!$this->param['table']) { $this->messages['message_erreur'][] = _T('cfg:nom_table_manquant'); return false; } // colid : nom de la colonne primary key list($this->param['table'], $colid) = $this->get_table_id($this->param['table']); // renseigner les liens id=valeur $id = explode('/',$this->param['cfg_id']); foreach ($colid as $n=>$c) { if (isset($id[$n])) { $this->_id[$c] = $id[$n]; } } if (!$this->param['cfg_id'] AND !($this->param['autoriser_absence_id'] == 'oui')) { $this->messages['message_erreur'][] = _T('cfg:id_manquant'); return false; } // select $this->_select = array(); if ($this->champs){ foreach ($this->champs as $nom => $def) { if (isset($def['id'])) { continue; } $this->_select[] = $nom; } } else { $this->_select[] = '*'; } // where $this->_where = array(); foreach ($this->_id as $nom => $id) { $this->_where[] = $nom . '=' . sql_quote($id); } $this->_base = ($d = sql_fetsel( $this->_select, $this->param['table'], $this->_where)) ? $d : array(); $this->_existe = count($this->_base); $this->_ici = &$this->_base; return true; } /** * recuperer les valeurs. * * @return Array */ function lire() { // charger if (!$this->charger()){ return array(false, $this->val, $this->messages); } // utile ?? if ($this->param['cfg_id']) { $cles = explode('/', $this->param['cfg_id']); foreach ($this->champs_id as $i => $name) { $this->_ici[$name] = $cles[$i]; } } // s'il y a des champs demandes, ne retourner que ceux-ci if (count($this->champs)){ $val = array(); foreach ($this->champs as $name => $def) { $val[$name] = $this->_ici[$name]; } $this->_ici = $val; } return array(true, $this->_ici); } /** * ecrit chaque enregistrement pour chaque champ. * * @return Array */ function ecrire() { // charger if (!$this->charger()){ return array(false, $this->val, $this->messages); } if ($this->champs){ foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; $this->_ici[$name] = $this->val[$name]; } } else { $this->_ici = $this->val; } // update if ($this->_existe) { $ok = sql_updateq($this->param['table'], $this->_ici, $this->_where ); } else { $ok = $id = sql_insertq($this->param['table'], $this->_ici); } // remettre l'id if ($ok && (count($this->champs_id)==1)) { $this->_ici[$nomid = $this->champs_id[0]] = $this->_existe ? $this->val[$nomid] : $ok; } return array($ok, $this->_ici); } /** * supprime chaque enregistrement pour chaque champ. * * @return Array */ function effacer(){ // charger if (!$this->charger()){ return array(false, $this->val, $this->messages); } $ok = !$this->_existe || sql_delete($this->param['table'], $this->_where ); return array($ok, array()); } /** * charger les arguments * - lire_config(table::table@colonne:id * - lire_config(table::table:id * * @param string $args * @return boolean */ function charger_args($args){ list($table, $id) = explode(':',$args,2); list($table, $colonne) = explode('@',$table); list($table, $colid) = $this->get_table_id($table); $this->param['cfg_id'] = $id; $this->param['champs'] = $colonne ? array($colonne=>true) : ''; $this->param['table'] = $table ? $table : 'spip_cfg'; // renseigner les liens id=valeur $id = explode(':',$id); foreach ($colid as $n=>$c) { if (isset($id[$n])) { $this->_id[$c] = $id[$n]; } } return true; } /** * se positionner dans le tableau arborescent * * @param &Array $base * @param string $chemin * @return &Array */ function & monte_arbre(&$base, $chemin){ if (!$chemin) { return $base; } if (!is_array($chemin)) { $chemin = explode('/', $chemin); } if (!is_array($base)) { $base = array(); } foreach ($chemin as $dossier) { if (!isset($base[$dossier])) { $base[$dossier] = array(); } $this->_arbre[] = array(&$base, $dossier); $base = &$base[$dossier]; } return $base; } /** * Cherche le vrai nom d'une table * ainsi que ses cles primaires * * @param string $table * @return Array */ function get_table_id($table) { static $catab = array( 'tables_principales' => 'base/serial', 'tables_auxiliaires' => 'base/auxiliaires', ); $try = array($table, 'spip_' . $table); foreach ($catab as $categ => $catinc) { include_spip($catinc); foreach ($try as $nom) { if (isset($GLOBALS[$categ][$nom])) { return array($nom, preg_split('/\s*,\s*/', $GLOBALS[$categ][$nom]['key']['PRIMARY KEY'])); } } } if ($try = table_objet($table)) { return array('spip_' . $try, array(id_table_objet($table))); } return array(false, false); } } ?> depots/metapack.php000066600000012642151452626520010361 0ustar00array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * Arbre * @var Array */ var $_arbre = array(); /** * version du depot * @var int */ var $version = 2; /** * Stockage interne dans les attributs de la classe * * @param Array $params */ function cfg_depot_metapack($params=array()) { foreach ($params as $o=>$v) { $this->$o = $v; } } /** * charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici) * * @param boolean $lire * @return boolean */ function charger($lire = false){ if ($lire && !isset($GLOBALS['meta'][$this->param['nom']])) return false; $this->_base = is_array($c = $GLOBALS['meta'][$this->param['nom']]) ? $c : @unserialize($c); $this->_arbre = array(); $this->_ici = &$this->_base; $this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']); $this->_ici = &$this->monte_arbre($this->_ici, isset($this->param['cfg_id']) ? $this->param['cfg_id'] : ''); return true; } /** * recuperer les valeurs. * * @return Array */ function lire() { if (!$this->charger(true)){ return array(true, null); // pas de chargement = pas de valeur encore enregistrees } $ici = &$this->_ici; // utile ?? if (isset($this->param['cfg_id'])) { $cles = explode('/', $this->param['cfg_id']); foreach ($this->champs_id as $i => $name) { $ici[$name] = $cles[$i]; } } // s'il y a des champs demandes, les retourner... sinon, retourner la base // (cas de lire_config('metapack::nom') tout court) if (count($this->champs)){ $val = array(); foreach ($this->champs as $name => $def) { $val[$name] = $ici[$name]; } $ici = $val; } return array(true, $ici); } /** * ecrit une meta pour tous les champs * * @return Array */ function ecrire() { // si pas de champs : on ecrit directement (ecrire_meta(metapack::nom,$val))... if (!$this->champs){ ecrire_meta($this->param['nom'], serialize($this->val)); if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, $this->val); } if (!$this->charger()){ return array(false, $this->val); } $ici = &$this->_ici; foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; $ici[$name] = $this->val[$name]; } ecrire_meta($this->param['nom'], serialize($this->_base)); if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, $ici); } /** * supprime chaque enregistrement de meta pour chaque champ * * @return Array */ function effacer(){ // si pas de champs : on supprime directement (effacer_meta(metapack::nom))... if (!$this->champs){ effacer_meta($this->param['nom']); if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, array()); } if (!$this->charger()){ return array(false, $this->val); } $ici = &$this->_ici; // supprimer les champs foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; unset($ici[$name]); } // supprimer les dossiers vides for ($i = count($this->_arbre); $i--; ) { if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) { break; } unset($this->_arbre[$i][0][$this->_arbre[$i][1]]); } if (!$this->_base) { effacer_meta($this->param['nom']); } else { ecrire_meta($this->param['nom'], serialize($this->_base)); } if (defined('_COMPAT_CFG_192')) ecrire_metas(); return array(true, array()); } /** * charger les arguments de lire_config(metapack::nom/casier/champ) * il se peut qu'il n'y ait pas de champs si : lire_config(metapack::nom); * * @param string $args # $args = 'nom'; ici * @return boolean */ function charger_args($args){ $args = explode('/',$args); $this->param['nom'] = array_shift($args); if ($champ = array_pop($args)) { $this->champs = array($champ=>true); } $this->param['casier'] = implode('/',$args); return true; } /** * se positionner dans le tableau arborescent * * @param &Array $base * @param string $chemin * @return &Array */ function & monte_arbre(&$base, $chemin){ if (!$chemin) { return $base; } if (!is_array($chemin)) { $chemin = explode('/', $chemin); } if (!is_array($base)) { $base = array(); } foreach ($chemin as $dossier) { if (!isset($base[$dossier])) { $base[$dossier] = array(); } $this->_arbre[] = array(&$base, $dossier); $base = &$base[$dossier]; } return $base; } } ?> depots/php.php000066600000013300151452626520007353 0ustar00array(), 'message_erreur'=>array(), 'erreurs'=>array()); /** * Arbre * @var Array */ var $_arbre = array(); /** * version du depot * @var int */ var $version = 2; /** * Dépôt dans les attributs de la classe * * @param Array $params */ function cfg_depot_php($params=array()) { foreach ($params as $o=>$v) { $this->$o = $v; } } /** * calcule l'emplacement du fichier * * @staticvar Array $fichier * @return string # L'emplacement du fichier */ function get_fichier(){ static $fichier = array(); $cle = $this->param['nom'] . ' - ' . $this->param['fichier']; if (isset($fichier[$cle])) return $fichier[$cle]; if (!$this->param['fichier']) $f = _DIR_VAR . 'cfg/' . $this->param['nom'] . '.php'; else $f = _DIR_RACINE . $this->param['fichier']; include_spip('inc/flock'); return $fichier[$cle] = sous_repertoire(dirname($f)) . basename($f); } /** * charge la base (racine) et le point de l'arbre sur lequel on se trouve (ici) * * @param boolean $lire * @return boolean */ function charger($lire=false){ $fichier = $this->get_fichier(); // inclut une variable $cfg if (!@include $fichier) { if ($lire) return false; $this->_base = array(); } elseif (!$cfg OR !is_array($cfg)) { $this->_base = array(); } else { $this->_base = $cfg; } $this->_ici = &$this->_base; $this->_ici = &$this->monte_arbre($this->_ici, $this->param['nom']); $this->_ici = &$this->monte_arbre($this->_ici, $this->param['casier']); $this->_ici = &$this->monte_arbre($this->_ici, $this->param['cfg_id']); return true; } /** * recuperer les valeurs. * * @return Array */ function lire() { if (!$this->charger(true)){ return array(true, null); // pas de chargement = pas de valeur encore enregistrees } // utile ?? if ($this->param['cfg_id']) { $cles = explode('/', $this->param['cfg_id']); foreach ($this->champs_id as $i => $name) { $this->_ici[$name] = $cles[$i]; } } return array(true, $this->_ici); } /** * ecrit chaque enregistrement pour chaque champ. * * @return Array */ function ecrire() { if (!$this->charger()){ return array(false, $this->val); } foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; $this->_ici[$name] = $this->val[$name]; } if (!$this->ecrire_fichier($this->_base)){ return array(false, $this->val); } return array(true, $this->_ici); } /** * supprime chaque enregistrement pour chaque champ. * * @return Array */ function effacer(){ if (!$this->charger()){ return array(false, $this->val); } // pas de champ, on supprime tout if (!$this->champs) return array($this->ecrire_fichier(), array()); // effacer les champs foreach ($this->champs as $name => $def) { if (isset($def['id'])) continue; unset($this->_ici[$name]); } // supprimer les dossiers vides for ($i = count($this->_arbre); $i--; ) { if ($this->_arbre[$i][0][$this->_arbre[$i][1]]) { break; } unset($this->_arbre[$i][0][$this->_arbre[$i][1]]); } return array($this->ecrire_fichier($this->_base), $this->_ici); } /** * Ecrire un fichier * * @param Array $contenu * @return boolean */ function ecrire_fichier($contenu=array()){ $fichier = $this->get_fichier(); if (!$contenu) { return supprimer_fichier($fichier); } $contenu = ' '; return ecrire_fichier($fichier, $contenu); } /** * charger les arguments de * - lire_config(php::nom/casier/champ) * - lire_config(php::adresse/fichier.php:nom/casier/champ) * * @param string $args * @return boolean */ function charger_args($args){ list($fichier, $args) = explode(':',$args); if (!$args) { $args = $fichier; $fichier = _DIR_VAR . 'cfg/' . $fichier . '.php'; } $this->param['fichier'] = $fichier; $arbre = explode('/',$args); $this->param['nom'] = array_shift($arbre); if ($champ = array_pop($arbre)) $this->champs = array($champ=>true); $this->param['casier'] = implode('/',$arbre); return true; } /** * se positionner dans le tableau arborescent * * @param &Array $base * @param Array $chemin * @return &Array */ function & monte_arbre(&$base, $chemin){ if (!$chemin) { return $base; } if (!is_array($chemin)) { $chemin = explode('/', $chemin); } if (!is_array($base)) { $base = array(); } foreach ($chemin as $dossier) { if (!isset($base[$dossier])) { $base[$dossier] = array(); } $this->_arbre[] = array(&$base, $dossier); $base = &$base[$dossier]; } return $base; } } ?> cfg-22.png000066600000002177151452626520006255 0ustar00PNG  IHDRĴl;bKGD pHYs  d_tIME  %yQI IDAT8˥Lu_q)ࡖriV  eijX ۓQ֚c--s&i-ؔg;C%v8.@;?Am}g{>Ͼk~?DB=WvBhGiMBhŀ/JA/ Q6>=۷<%ԜS`I 0`}=222"UEB;1/gMNyKe!8íV+(] -F`ILḺ7c}޲e 6mDT$I?3yE%(jњ%;\!~?iZdJ`kut6DۧeB`!DJ||o/4=SHo}r:Հj+72E'ڣC֟m+\_hƲ$Z[[isfpSZUu; og|{#g8Z9qTSE7%\p+C^JMr.Ե%Ef5|8tdn^IVQ#u>,H+ZjEPH4($ ypf#>.;7 ܨ`L~?cO?!ʲʇW#I҂pC$kVqvɳpnOߟ-2+V=Ņ=Eʐ+,{gsE=^Kpnuߤ_P__ng~<@ee%#V<#eOSZI z؞+ ZwXt:NXe̩i466B0wҘU5FNV.$ 0<11뱱1TU{7cɶX_nq~)Ѿ6%b&jUg``Ś;zMMѯg,PS%:Ps魇 uBb#1 JQb]b*IENDB`vues/config.php000066600000001222151452626520007515 0ustar00