Browse Source

Indentation et formatage du code

svn/root/tags/v2.5.21
teddy.spip@gmail.com 7 years ago
parent
commit
bb3abf5820
  1. 898
      inc/saisies_afficher.php
  2. 200
      inc/saisies_lister.php
  3. 226
      inc/saisies_manipuler.php

898
inc/saisies_afficher.php

@ -1,440 +1,458 @@
<?php
/**
* Gestion de l'affichage des saisies
*
* @return SPIP\Saisies\Afficher
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Indique si une saisie peut être affichée.
*
* On s'appuie sur l'éventuelle clé "editable" du $champ.
* Si editable vaut :
* - absent : le champ est éditable
* - 1, le champ est éditable
* - 0, le champ n'est pas éditable
* - -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)
* ou dans un de ses enfants (fieldsets)
*
* @param array $champ
* Tableau de description de la saisie
* @param array $env
* Environnement transmis à la saisie, certainement l'environnement du formulaire
* @param bool $utiliser_editable
* - false pour juste tester le cas -1
*
* @return bool
* Retourne un booléen indiquant l'état éditable ou pas :
* - true si la saisie est éditable (peut être affichée)
* - false sinon
*/
function saisie_editable($champ, $env, $utiliser_editable=true) {
if ($utiliser_editable) {
// si le champ n'est pas éditable, on sort.
if (!isset($champ['editable'])) {
return true;
}
$editable = $champ['editable'];
if ($editable > 0) {
return true;
}
if ($editable == 0) {
return false;
}
}
// cas -1
// name de la saisie
if (isset($champ['options']['nom'])) {
// si on a le name dans l'environnement, on le teste
$nom = $champ['options']['nom'];
if (isset($env[$nom])) {
return $env[$nom] ? true : false ;
}
}
// sinon, si on a des sous saisies
if (isset($champ['saisies']) and is_array($champ['saisies'])) {
foreach($champ['saisies'] as $saisie) {
if (saisie_editable($saisie, $env, false)) {
return true;
}
}
}
// aucun des paramètres demandés n'avait de contenu
return false;
}
/**
* Génère une saisie à partir d'un tableau la décrivant et de l'environnement
*
* @param array $champ
* Description de la saisie.
* Le tableau doit être de la forme suivante :
* array(
* 'saisie' => 'input',
* 'options' => array(
* 'nom' => 'le_name',
* 'label' => 'Un titre plus joli',
* 'obligatoire' => 'oui',
* 'explication' => 'Remplissez ce champ en utilisant votre clavier.'
* )
* )
* @param array $env
* Environnement du formulaire
* Permet de savoir les valeurs actuelles des contenus des saisies,
* les erreurs eventuelles présentes...
* @return string
* Code HTML des saisies de formulaire
*/
function saisies_generer_html($champ, $env=array()){
// Si le parametre n'est pas bon, on genere du vide
if (!is_array($champ))
return '';
// Si la saisie n'est pas editable, on sort aussi.
if (!saisie_editable($champ, $env)) {
return '';
}
$contexte = array();
// On sélectionne le type de saisie
$contexte['type_saisie'] = $champ['saisie'];
// Identifiant unique de saisie, si present
if (isset($champ['identifiant'])) {
$contexte['id_saisie'] = $champ['identifiant'];
}
// Peut-être des transformations à faire sur les options textuelles
$options = $champ['options'];
foreach ($options as $option => $valeur){
if ($option == 'datas') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
}
// compatibilité li_class > conteneur_class
if (!empty($options['li_class'])) {
$options['conteneur_class'] = $options['li_class'];
}
// On ajoute les options propres à la saisie
$contexte = array_merge($contexte, $options);
// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
if (isset($contexte['env']) or (isset($champ['saisies']) AND is_array($champ['saisies']))) {
unset($contexte['env']);
// on sauve l'ancien environnement
// car les sous-saisies ne doivent pas être affectees
// par les modification sur l'environnement servant à generer la saisie mère
$contexte['_env'] = $env;
// À partir du moment où on passe tout l'environnement, il faut enlever certains éléments qui ne doivent absolument provenir que des options
unset($env['inserer_debut']);
unset($env['inserer_fin']);
$saisies_disponibles = saisies_lister_disponibles();
if (isset($saisies_disponibles[$contexte['type_saisie']]) and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
$options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
foreach ($options_a_supprimer as $option_a_supprimer){
unset($env[$option_a_supprimer]);
}
}
$contexte = array_merge($env, $contexte);
}
// Sinon on ne sélectionne que quelques éléments importants
else{
// On récupère la liste des erreurs
$contexte['erreurs'] = $env['erreurs'];
// On récupère la langue de l'objet si existante
if(isset($env['langue']))
$contexte['langue'] = $env['langue'];
// On ajoute toujours le bon self
$contexte['self'] = self();
}
// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
// Si le nom du champ est un tableau indexé, il faut parser !
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
$contexte['valeur'] = $env[$separe[1]];
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach($index[1] as $cle){
$contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;
}
}
// Sinon la valeur est juste celle du nom
else {
$contexte['valeur'] = (isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : null);
}
// Si ya des enfants on les remonte dans le contexte
if (isset($champ['saisies']) and is_array($champ['saisies'])) {
$contexte['saisies'] = $champ['saisies'];
}
// On génère la saisie
return recuperer_fond(
'saisies/_base',
$contexte
);
}
/**
* Génère une vue d'une saisie à partir d'un tableau la décrivant
*
* @see saisies_generer_html()
* @param array $saisie
* Tableau de description d'une saisie
* @param array $env
* L'environnement, contenant normalement la réponse à la saisie
* @param array $env_obligatoire
* ???
* @return string
* Code HTML de la vue de la saisie
*/
function saisies_generer_vue($saisie, $env=array(), $env_obligatoire=array()){
// Si le paramètre n'est pas bon, on génère du vide
if (!is_array($saisie))
return '';
$contexte = array();
// On sélectionne le type de saisie
$contexte['type_saisie'] = $saisie['saisie'];
// Peut-être des transformations à faire sur les options textuelles
$options = $saisie['options'];
foreach ($options as $option => $valeur){
if ($option == 'datas') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
}
// On ajoute les options propres à la saisie
$contexte = array_merge($contexte, $options);
// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
if (isset($contexte['env']) or (isset($saisie['saisies']) AND is_array($saisie['saisies']))){
unset($contexte['env']);
// on sauve l'ancien environnement
// car les sous-saisies ne doivent pas être affectees
// par les modification sur l'environnement servant à generer la saisie mère
$contexte['_env'] = $env;
// À partir du moment où on passe tout l'environnement, il faut enlever
// certains éléments qui ne doivent absolument provenir que des options
$saisies_disponibles = saisies_lister_disponibles();
if (isset($saisies_disponibles[$contexte['type_saisie']]['options'])
and is_array($saisies_disponibles[$contexte['type_saisie']]['options']))
{
$options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
foreach ($options_a_supprimer as $option_a_supprimer) {
unset($env[$option_a_supprimer]);
}
}
$contexte = array_merge($env, $contexte);
}
// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
// On regarde en priorité s'il y a un tableau listant toutes les valeurs
if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])){
$contexte['valeur'] = $env['valeurs'][$contexte['nom']];
}
// Si le nom du champ est un tableau indexé, il faut parser !
elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)){
$contexte['valeur'] = $env[$separe[1]];
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach($index[1] as $cle){
$contexte['valeur'] = $contexte['valeur'][$cle];
}
}
// Sinon la valeur est juste celle du nom
else {
// certains n'ont pas de nom (fieldset)
$contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';
}
// Si ya des enfants on les remonte dans le contexte
if (isset($saisie['saisies']) AND is_array($saisie['saisies']))
$contexte['saisies'] = $saisie['saisies'];
if (is_array($env_obligatoire)) {
$contexte = array_merge($contexte, $env_obligatoire);
}
// On génère la saisie
return recuperer_fond(
'saisies-vues/_base',
$contexte
);
}
/**
* Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES
* pour produire un affichage conditionnel des saisies ayant une option afficher_si ou afficher_si_remplissage.
*
* @param array $saisies
* Tableau de descriptions des saisies
* @param string $id_form
* Identifiant unique pour le formulaire
* @return text
* Code javascript
*/
function saisies_generer_js_afficher_si($saisies,$id_form){
$i = 0;
$saisies = saisies_lister_par_nom($saisies,true);
$code = '';
$code .= '(function($){';
$code .= '$(document).ready(function(){chargement=true;';
$code .= 'verifier_saisies_'.$id_form." = function(form){\n";
foreach ($saisies as $saisie) {
// on utilise comme selecteur l'identifiant de saisie en priorite s'il est connu
// parce que conteneur_class = 'tableau[nom][option]' ne fonctionne evidement pas
// lorsque le name est un tableau
if (isset($saisie['options']['afficher_si']) or isset($saisie['options']['afficher_si_remplissage'])) {
$i++;
// retrouver la classe css probable
switch ($saisie['saisie']) {
case 'fieldset':
$class_li = 'fieldset_'.$saisie['options']['nom'];
break;
case 'explication':
$class_li = 'explication_'.$saisie['options']['nom'];
break;
default:
$class_li = 'editer_'.$saisie['options']['nom'];
}
$afficher_si = isset($saisie['options']['afficher_si']) ? $saisie['options']['afficher_si'] : '';
$afficher_si_remplissage = isset($saisie['options']['afficher_si_remplissage']) ? $saisie['options']['afficher_si_remplissage'] : '';
$condition = join("\n", array_filter(array($afficher_si, $afficher_si_remplissage)));
// retrouver l'identifiant
$identifiant = '';
if (isset($saisie['identifiant']) and $saisie['identifiant']) {
$identifiant = $saisie['identifiant'];
}
// On gère le cas @plugin:non_plugin@
preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plug) {
if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
else
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
}
// On gère le cas @config:plugin:meta@ suivi d'un test
preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plugin) {
$config = lire_config($plugin);
$condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
}
// On transforme en une condition valide
preg_match_all('#@(.+)@#U', $condition, $matches);
foreach ($matches[1] as $nom) {
switch($saisies[$nom]['saisie']) {
case 'radio':
case 'oui_non':
case 'true_false':
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']:checked").val()', $condition);
break;
case 'case':
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'\']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'\']").val() : "")', $condition);
break;
case 'checkbox':
preg_match_all('#@(.+)@\s*==\s*"(.*)"$#U', $condition, $matches2);
foreach ($matches2[2] as $value) {
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$value.']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$value.']").val() : "")', $condition);
}
break;
default:
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);
}
}
if ($identifiant) {
$sel = "[data-id='$identifiant']";
} else {
$sel = ".$class_li";
}
$code .= "\tif (".$condition.') {$(form).find("'.$sel.'").show(400);} '."\n\t";
$code .= 'else {if (chargement==true) {$(form).find("'.$sel.'").hide(400).css("display","none");} else {$(form).find("'.$sel.'").hide(400);};} '."\n";
}
}
$code .= "};";
$code .= '$("#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';
$code .= '$("#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';
$code .= 'chargement=false;})';
$code .= '})(jQuery);';
return $i>0 ? $code : '';
}
/**
* Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si
* et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies.
*
* Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier().
* À ce moment là, les saisies non affichées sont retirées de _request
* (on passe leur valeur à NULL).
*
* @param array $saisies
* Tableau de descriptions de saisies
* @param array|null $env
* Tableau d'environnement transmis dans inclure/voi_saisies.html,
* NULL si on doit rechercher dans _request (pour saisies_verifier()).
* @return array
* Tableau de descriptions de saisies
*/
function saisies_verifier_afficher_si($saisies, $env=NULL) {
// eviter une erreur par maladresse d'appel :)
if (!is_array($saisies)) {
return array();
}
foreach ($saisies as $cle => $saisie) {
if (isset($saisie['options']['afficher_si'])) {
$condition = $saisie['options']['afficher_si'];
// On gère le cas @plugin:non_plugin@
preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plug) {
if (defined('_DIR_PLUGIN_'.strtoupper($plug)))
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
else
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
}
// On gère le cas @config:plugin:meta@ suivi d'un test
preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plugin) {
$config = lire_config($plugin);
$condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
}
// On transforme en une condition valide
if (is_null($env))
$condition = preg_replace('#@(.+)@#U', '_request(\'$1\')', $condition);
else
$condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);
eval('$ok = '.$condition.';');
if (!$ok) {
unset($saisies[$cle]);
if (is_null($env)) set_request($saisie['options']['nom'],NULL);
}
}
if (isset($saisies[$cle]['saisies'])) // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
$saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);
}
return $saisies;
}
<?php
/**
* Gestion de l'affichage des saisies.
*
* @return SPIP\Saisies\Afficher
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Indique si une saisie peut être affichée.
*
* On s'appuie sur l'éventuelle clé "editable" du $champ.
* Si editable vaut :
* - absent : le champ est éditable
* - 1, le champ est éditable
* - 0, le champ n'est pas éditable
* - -1, le champ est éditable s'il y a du contenu dans le champ (l'environnement)
* ou dans un de ses enfants (fieldsets)
*
* @param array $champ
* Tableau de description de la saisie
* @param array $env
* Environnement transmis à la saisie, certainement l'environnement du formulaire
* @param bool $utiliser_editable
* - false pour juste tester le cas -1
*
* @return bool
* Retourne un booléen indiquant l'état éditable ou pas :
* - true si la saisie est éditable (peut être affichée)
* - false sinon
*/
function saisie_editable($champ, $env, $utiliser_editable = true) {
if ($utiliser_editable) {
// si le champ n'est pas éditable, on sort.
if (!isset($champ['editable'])) {
return true;
}
$editable = $champ['editable'];
if ($editable > 0) {
return true;
}
if ($editable == 0) {
return false;
}
}
// cas -1
// name de la saisie
if (isset($champ['options']['nom'])) {
// si on a le name dans l'environnement, on le teste
$nom = $champ['options']['nom'];
if (isset($env[$nom])) {
return $env[$nom] ? true : false;
}
}
// sinon, si on a des sous saisies
if (isset($champ['saisies']) and is_array($champ['saisies'])) {
foreach ($champ['saisies'] as $saisie) {
if (saisie_editable($saisie, $env, false)) {
return true;
}
}
}
// aucun des paramètres demandés n'avait de contenu
return false;
}
/**
* Génère une saisie à partir d'un tableau la décrivant et de l'environnement.
*
* @param array $champ
* Description de la saisie.
* Le tableau doit être de la forme suivante :
* array(
* 'saisie' => 'input',
* 'options' => array(
* 'nom' => 'le_name',
* 'label' => 'Un titre plus joli',
* 'obligatoire' => 'oui',
* 'explication' => 'Remplissez ce champ en utilisant votre clavier.'
* )
* )
* @param array $env
* Environnement du formulaire
* Permet de savoir les valeurs actuelles des contenus des saisies,
* les erreurs eventuelles présentes...
*
* @return string
* Code HTML des saisies de formulaire
*/
function saisies_generer_html($champ, $env = array()) {
// Si le parametre n'est pas bon, on genere du vide
if (!is_array($champ)) {
return '';
}
// Si la saisie n'est pas editable, on sort aussi.
if (!saisie_editable($champ, $env)) {
return '';
}
$contexte = array();
// On sélectionne le type de saisie
$contexte['type_saisie'] = $champ['saisie'];
// Identifiant unique de saisie, si present
if (isset($champ['identifiant'])) {
$contexte['id_saisie'] = $champ['identifiant'];
}
// Peut-être des transformations à faire sur les options textuelles
$options = $champ['options'];
foreach ($options as $option => $valeur) {
if ($option == 'datas') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
}
// compatibilité li_class > conteneur_class
if (!empty($options['li_class'])) {
$options['conteneur_class'] = $options['li_class'];
}
// On ajoute les options propres à la saisie
$contexte = array_merge($contexte, $options);
// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
if (isset($contexte['env']) or (isset($champ['saisies']) and is_array($champ['saisies']))) {
unset($contexte['env']);
// on sauve l'ancien environnement
// car les sous-saisies ne doivent pas être affectees
// par les modification sur l'environnement servant à generer la saisie mère
$contexte['_env'] = $env;
// À partir du moment où on passe tout l'environnement, il faut enlever certains éléments qui ne doivent absolument provenir que des options
unset($env['inserer_debut']);
unset($env['inserer_fin']);
$saisies_disponibles = saisies_lister_disponibles();
if (isset($saisies_disponibles[$contexte['type_saisie']]) and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
$options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
foreach ($options_a_supprimer as $option_a_supprimer) {
unset($env[$option_a_supprimer]);
}
}
$contexte = array_merge($env, $contexte);
}
// Sinon on ne sélectionne que quelques éléments importants
else {
// On récupère la liste des erreurs
$contexte['erreurs'] = $env['erreurs'];
// On récupère la langue de l'objet si existante
if (isset($env['langue'])) {
$contexte['langue'] = $env['langue'];
}
// On ajoute toujours le bon self
$contexte['self'] = self();
}
// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
// Si le nom du champ est un tableau indexé, il faut parser !
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)) {
$contexte['valeur'] = $env[$separe[1]];
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach ($index[1] as $cle) {
$contexte['valeur'] = isset($contexte['valeur'][$cle]) ? $contexte['valeur'][$cle] : null;
}
}
// Sinon la valeur est juste celle du nom
else {
$contexte['valeur'] = (isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : null);
}
// Si ya des enfants on les remonte dans le contexte
if (isset($champ['saisies']) and is_array($champ['saisies'])) {
$contexte['saisies'] = $champ['saisies'];
}
// On génère la saisie
return recuperer_fond(
'saisies/_base',
$contexte
);
}
/**
* Génère une vue d'une saisie à partir d'un tableau la décrivant.
*
* @see saisies_generer_html()
*
* @param array $saisie
* Tableau de description d'une saisie
* @param array $env
* L'environnement, contenant normalement la réponse à la saisie
* @param array $env_obligatoire
* ???
*
* @return string
* Code HTML de la vue de la saisie
*/
function saisies_generer_vue($saisie, $env = array(), $env_obligatoire = array()) {
// Si le paramètre n'est pas bon, on génère du vide
if (!is_array($saisie)) {
return '';
}
$contexte = array();
// On sélectionne le type de saisie
$contexte['type_saisie'] = $saisie['saisie'];
// Peut-être des transformations à faire sur les options textuelles
$options = $saisie['options'];
foreach ($options as $option => $valeur) {
if ($option == 'datas') {
// exploser une chaine datas en tableau (applique _T_ou_typo sur chaque valeur)
$options[$option] = saisies_chaine2tableau($valeur);
} else {
$options[$option] = _T_ou_typo($valeur, 'multi');
}
}
// On ajoute les options propres à la saisie
$contexte = array_merge($contexte, $options);
// Si env est définie dans les options ou qu'il y a des enfants, on ajoute tout l'environnement
if (isset($contexte['env']) or (isset($saisie['saisies']) and is_array($saisie['saisies']))) {
unset($contexte['env']);
// on sauve l'ancien environnement
// car les sous-saisies ne doivent pas être affectees
// par les modification sur l'environnement servant à generer la saisie mère
$contexte['_env'] = $env;
// À partir du moment où on passe tout l'environnement, il faut enlever
// certains éléments qui ne doivent absolument provenir que des options
$saisies_disponibles = saisies_lister_disponibles();
if (isset($saisies_disponibles[$contexte['type_saisie']]['options'])
and is_array($saisies_disponibles[$contexte['type_saisie']]['options'])) {
$options_a_supprimer = saisies_lister_champs($saisies_disponibles[$contexte['type_saisie']]['options']);
foreach ($options_a_supprimer as $option_a_supprimer) {
unset($env[$option_a_supprimer]);
}
}
$contexte = array_merge($env, $contexte);
}
// Dans tous les cas on récupère de l'environnement la valeur actuelle du champ
// On regarde en priorité s'il y a un tableau listant toutes les valeurs
if ($env['valeurs'] and is_array($env['valeurs']) and isset($env['valeurs'][$contexte['nom']])) {
$contexte['valeur'] = $env['valeurs'][$contexte['nom']];
}
// Si le nom du champ est un tableau indexé, il faut parser !
elseif (preg_match('/([\w]+)((\[[\w]+\])+)/', $contexte['nom'], $separe)) {
$contexte['valeur'] = $env[$separe[1]];
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach ($index[1] as $cle) {
$contexte['valeur'] = $contexte['valeur'][$cle];
}
}
// Sinon la valeur est juste celle du nom
else {
// certains n'ont pas de nom (fieldset)
$contexte['valeur'] = isset($env[$contexte['nom']]) ? $env[$contexte['nom']] : '';
}
// Si ya des enfants on les remonte dans le contexte
if (isset($saisie['saisies']) and is_array($saisie['saisies'])) {
$contexte['saisies'] = $saisie['saisies'];
}
if (is_array($env_obligatoire)) {
$contexte = array_merge($contexte, $env_obligatoire);
}
// On génère la saisie
return recuperer_fond(
'saisies-vues/_base',
$contexte
);
}
/**
* Génère, à partir d'un tableau de saisie le code javascript ajouté à la fin de #GENERER_SAISIES
* pour produire un affichage conditionnel des saisies ayant une option afficher_si ou afficher_si_remplissage.
*
* @param array $saisies
* Tableau de descriptions des saisies
* @param string $id_form
* Identifiant unique pour le formulaire
*
* @return text
* Code javascript
*/
function saisies_generer_js_afficher_si($saisies, $id_form) {
$i = 0;
$saisies = saisies_lister_par_nom($saisies, true);
$code = '';
$code .= '(function($){';
$code .= '$(document).ready(function(){chargement=true;';
$code .= 'verifier_saisies_'.$id_form." = function(form){\n";
foreach ($saisies as $saisie) {
// on utilise comme selecteur l'identifiant de saisie en priorite s'il est connu
// parce que conteneur_class = 'tableau[nom][option]' ne fonctionne evidement pas
// lorsque le name est un tableau
if (isset($saisie['options']['afficher_si']) or isset($saisie['options']['afficher_si_remplissage'])) {
++$i;
// retrouver la classe css probable
switch ($saisie['saisie']) {
case 'fieldset':
$class_li = 'fieldset_'.$saisie['options']['nom'];
break;
case 'explication':
$class_li = 'explication_'.$saisie['options']['nom'];
break;
default:
$class_li = 'editer_'.$saisie['options']['nom'];
}
$afficher_si = isset($saisie['options']['afficher_si']) ? $saisie['options']['afficher_si'] : '';
$afficher_si_remplissage = isset($saisie['options']['afficher_si_remplissage']) ? $saisie['options']['afficher_si_remplissage'] : '';
$condition = implode("\n", array_filter(array($afficher_si, $afficher_si_remplissage)));
// retrouver l'identifiant
$identifiant = '';
if (isset($saisie['identifiant']) and $saisie['identifiant']) {
$identifiant = $saisie['identifiant'];
}
// On gère le cas @plugin:non_plugin@
preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plug) {
if (defined('_DIR_PLUGIN_'.strtoupper($plug))) {
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
} else {
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
}
}
// On gère le cas @config:plugin:meta@ suivi d'un test
preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plugin) {
$config = lire_config($plugin);
$condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
}
// On transforme en une condition valide
preg_match_all('#@(.+)@#U', $condition, $matches);
foreach ($matches[1] as $nom) {
switch ($saisies[$nom]['saisie']) {
case 'radio':
case 'oui_non':
case 'true_false':
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']:checked").val()', $condition);
break;
case 'case':
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'\']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'\']").val() : "")', $condition);
break;
case 'checkbox':
preg_match_all('#@(.+)@\s*==\s*"(.*)"$#U', $condition, $matches2);
foreach ($matches2[2] as $value) {
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$value.']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'[]\'][value='.$value.']").val() : "")', $condition);
}
break;
default:
$condition = preg_replace('#@'.preg_quote($nom).'@#U', '$(form).find("[name=\''.$nom.'\']").val()', $condition);
}
}
if ($identifiant) {
$sel = "[data-id='$identifiant']";
} else {
$sel = ".$class_li";
}
$code .= "\tif (".$condition.') {$(form).find("'.$sel.'").show(400);} '."\n\t";
$code .= 'else {if (chargement==true) {$(form).find("'.$sel.'").hide(400).css("display","none");} else {$(form).find("'.$sel.'").hide(400);};} '."\n";
}
}
$code .= '};';
$code .= '$("#afficher_si_'.$id_form.'").parents("form").each(function(){verifier_saisies_'.$id_form.'(this);});';
$code .= '$("#afficher_si_'.$id_form.'").parents("form").change(function(){verifier_saisies_'.$id_form.'(this);});';
$code .= 'chargement=false;})';
$code .= '})(jQuery);';
return $i > 0 ? $code : '';
}
/**
* Lorsque l'on affiche les saisies (#VOIR_SAISIES), les saisies ayant une option afficher_si
* et dont les conditions ne sont pas remplies doivent être retirées du tableau de saisies.
*
* Cette fonction sert aussi lors de la vérification des saisies avec saisies_verifier().
* À ce moment là, les saisies non affichées sont retirées de _request
* (on passe leur valeur à NULL).
*
* @param array $saisies
* Tableau de descriptions de saisies
* @param array|null $env
* Tableau d'environnement transmis dans inclure/voi_saisies.html,
* NULL si on doit rechercher dans _request (pour saisies_verifier()).
*
* @return array
* Tableau de descriptions de saisies
*/
function saisies_verifier_afficher_si($saisies, $env = null) {
// eviter une erreur par maladresse d'appel :)
if (!is_array($saisies)) {
return array();
}
foreach ($saisies as $cle => $saisie) {
if (isset($saisie['options']['afficher_si'])) {
$condition = $saisie['options']['afficher_si'];
// On gère le cas @plugin:non_plugin@
preg_match_all('#@plugin:(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plug) {
if (defined('_DIR_PLUGIN_'.strtoupper($plug))) {
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'true', $condition);
} else {
$condition = preg_replace('#@plugin:'.$plug.'@#U', 'false', $condition);
}
}
// On gère le cas @config:plugin:meta@ suivi d'un test
preg_match_all('#@config:(.+):(.+)@#U', $condition, $matches);
foreach ($matches[1] as $plugin) {
$config = lire_config($plugin);
$condition = preg_replace('#@config:'.$plugin.':'.$matches[2][0].'@#U', '"'.$config[$matches[2][0]].'"', $condition);
}
// On transforme en une condition valide
if (is_null($env)) {
$condition = preg_replace('#@(.+)@#U', '_request(\'$1\')', $condition);
} else {
$condition = preg_replace('#@(.+)@#U', '$env["valeurs"][\'$1\']', $condition);
}
eval('$ok = '.$condition.';');
if (!$ok) {
unset($saisies[$cle]);
if (is_null($env)) {
set_request($saisie['options']['nom'], null);
}
}
}
if (isset($saisies[$cle]['saisies'])) { // S'il s'agit d'un fieldset ou equivalent, verifier les sous-saisies
$saisies[$cle]['saisies'] = saisies_verifier_afficher_si($saisies[$cle]['saisies'], $env);
}
}
return $saisies;
}

200
inc/saisies_lister.php

@ -1,30 +1,33 @@
<?php
/**
* Gestion de listes des saisies
* Gestion de listes des saisies.
*
* @return SPIP\Saisies\Listes
**/
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Prend la description complète du contenu d'un formulaire et retourne
* les saisies "à plat" classées par identifiant unique.
*
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
*
* @return array Un tableau avec uniquement les saisies
*/
function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
function saisies_lister_par_identifiant($contenu, $avec_conteneur = true) {
$saisies = array();
if (is_array($contenu)){
foreach ($contenu as $ligne){
if (is_array($contenu)) {
foreach ($contenu as $ligne) {
if (is_array($ligne)) {
$enfants_presents = (isset($ligne['saisies']) and is_array($ligne['saisies']));
if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)){
if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)) {
$saisies[$ligne['identifiant']] = $ligne;
}
if ($enfants_presents) {
@ -33,7 +36,7 @@ function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
}
}
}
return $saisies;
}
@ -41,37 +44,39 @@ function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
* Prend la description complète du contenu d'un formulaire et retourne
* les saisies "à plat" classées par nom.
*
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
*
* @return array Un tableau avec uniquement les saisies
*/
function saisies_lister_par_nom($contenu, $avec_conteneur=true){
function saisies_lister_par_nom($contenu, $avec_conteneur = true) {
$saisies = array();
if (is_array($contenu)){
foreach ($contenu as $ligne){
if (is_array($ligne)){
if (array_key_exists('saisie', $ligne) and (!isset($ligne['saisies']) OR !is_array($ligne['saisies']) or $avec_conteneur)){
if (is_array($contenu)) {
foreach ($contenu as $ligne) {
if (is_array($ligne)) {
if (array_key_exists('saisie', $ligne) and (!isset($ligne['saisies']) or !is_array($ligne['saisies']) or $avec_conteneur)) {
$saisies[$ligne['options']['nom']] = $ligne;
}
if (isset($ligne['saisies']) AND is_array($ligne['saisies'])){
if (isset($ligne['saisies']) and is_array($ligne['saisies'])) {
$saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies']));
}
}
}
}
return $saisies;
}
/**
* Liste les saisies ayant une option X
* # saisies_lister_avec_option('sql', $saisies);
*
* # saisies_lister_avec_option('sql', $saisies);.
*
*
* @param String $option Nom de l'option cherchée
* @param Array $saisies Liste de saisies
* @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
*
* @param String $option Nom de l'option cherchée
* @param Array $saisies Liste de saisies
* @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
* @return liste de ces saisies triees par nom ayant une option X définie
*/
function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
@ -79,7 +84,7 @@ function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
// tri par nom si ce n'est pas le cas
$s = array_keys($saisies);
if (is_int(array_shift($s))) {
$trier = 'saisies_lister_par_' . $tri;
$trier = 'saisies_lister_par_'.$tri;
$saisies = $trier($saisies);
}
foreach ($saisies as $nom_ou_id => $saisie) {
@ -92,10 +97,11 @@ function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
}
/**
* Liste les saisies ayant une definition SQL
* Liste les saisies ayant une definition SQL.
*
* @param Array $saisies liste de saisies
* @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
*
* @param Array $saisies liste de saisies
* @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
* @return liste de ces saisies triees par nom ayant une option sql définie
*/
function saisies_lister_avec_sql($saisies, $tri = 'nom') {
@ -105,27 +111,28 @@ function saisies_lister_avec_sql($saisies, $tri = 'nom') {
/**
* Prend la description complète du contenu d'un formulaire et retourne
* les saisies "à plat" classées par type de saisie.
* $saisie['input']['input_1'] = $saisie
* $saisie['input']['input_1'] = $saisie.
*
* @param array $contenu Le contenu d'un formulaire
*
* @return array Un tableau avec uniquement les saisies
*/
function saisies_lister_par_type($contenu) {
$saisies = array();
if (is_array($contenu)){
foreach ($contenu as $ligne){
if (is_array($ligne)){
if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))){
if (is_array($contenu)) {
foreach ($contenu as $ligne) {
if (is_array($ligne)) {
if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))) {
$saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne;
}
if (is_array($ligne['saisies'])){
if (is_array($ligne['saisies'])) {
$saisies = array_merge_recursive($saisies, saisies_lister_par_type($ligne['saisies']));
}
}
}
}
return $saisies;
}
@ -133,29 +140,34 @@ function saisies_lister_par_type($contenu) {
* Prend la description complète du contenu d'un formulaire et retourne
* une liste des noms des champs du formulaire.
*
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
* @param array $contenu Le contenu d'un formulaire
* @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
*
* @return array Un tableau listant les noms des champs
*/
function saisies_lister_champs($contenu, $avec_conteneur=true){
function saisies_lister_champs($contenu, $avec_conteneur = true) {
$saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
return array_keys($saisies);
}
/**
* A utiliser dans une fonction charger d'un formulaire CVT,
* cette fonction renvoie le tableau de contexte correspondant
* de la forme $contexte['nom_champ'] = ''
* de la forme $contexte['nom_champ'] = ''.
*
* @param array $contenu Le contenu d'un formulaire (un tableau de saisies)
*
* @return array Un tableau de contexte
*/
function saisies_charger_champs($contenu) {
// array_fill_keys est disponible uniquement avec PHP >= 5.2.0
// return array_fill_keys(saisies_lister_champs($contenu, false), '');
$champs = array();
foreach (saisies_lister_champs($contenu, false) as $champ)
foreach (saisies_lister_champs($contenu, false) as $champ) {
$champs[$champ] = '';
}
return $champs;
}
@ -164,38 +176,41 @@ function saisies_charger_champs($contenu) {
* une liste des valeurs par défaut des champs du formulaire.
*
* @param array $contenu Le contenu d'un formulaire
*
* @return array Un tableau renvoyant la valeur par défaut de chaque champs
*/
function saisies_lister_valeurs_defaut($contenu){
function saisies_lister_valeurs_defaut($contenu) {
$contenu = saisies_lister_par_nom($contenu, false);
$defauts = array();
foreach ($contenu as $nom => $saisie){
foreach ($contenu as $nom => $saisie) {
// Si le nom du champ est un tableau indexé, il faut parser !
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)){
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)) {
$nom = $separe[1];
// Dans ce cas on ne récupère que le nom, la valeur par défaut du tableau devra être renseigné autre part
$defauts[$nom] = array();
}
else{
} else {
$defauts[$nom] = isset($saisie['options']['defaut']) ? $saisie['options']['defaut'] : '';
}
}
return $defauts;
}
/**
* Compare deux tableaux de saisies pour connaitre les différences
* @param array $saisies_anciennes Un tableau décrivant des saisies
* @param array $saisies_nouvelles Un autre tableau décrivant des saisies
* @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
* @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant'
* Compare deux tableaux de saisies pour connaitre les différences.
*
* @param array $saisies_anciennes Un tableau décrivant des saisies
* @param array $saisies_nouvelles Un autre tableau décrivant des saisies
* @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
* @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant'
*
* @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
*/
function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true, $tri = 'nom') {
function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur = true, $tri = 'nom') {
$trier = "saisies_lister_par_$tri";
$saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur);
$saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur);
// Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles
$saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles);
// Les saisies ajoutées, c'est le contraire
@ -207,55 +222,61 @@ function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneu
#$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel');
// Et enfin les saisies qui ont le même nom et la même valeur
$saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees);
return array(
'supprimees' => $saisies_supprimees,
'ajoutees' => $saisies_ajoutees,
'modifiees' => $saisies_modifiees,
'identiques' => $saisies_identiques
'identiques' => $saisies_identiques,
);
}
/**
* Compare deux saisies et indique si elles sont égales ou pas
* Compare deux saisies et indique si elles sont égales ou pas.
*
* @param array $a Une description de saisie
* @param array $b Une autre description de saisie
*
* @return int Retourne 0 si les saisies sont identiques, 1 sinon.
*/
function saisies_comparer_rappel($a, $b){
if ($a === $b) return 0;
else return 1;
function saisies_comparer_rappel($a, $b) {
if ($a === $b) {
return 0;
} else {
return 1;
}
}
/**
* Compare deux tableaux de saisies pour connaitre les différences
* en s'appuyant sur les identifiants de saisies
* en s'appuyant sur les identifiants de saisies.
*
* @see saisies_comparer()
*
* @param array $saisies_anciennes Un tableau décrivant des saisies
* @param array $saisies_nouvelles Un autre tableau décrivant des saisies
* @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
* @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
*
* @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
*/
function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true) {
function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur = true) {
return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, $tri = 'identifiant');
}
/**
* Liste toutes les saisies configurables (ayant une description)
* Liste toutes les saisies configurables (ayant une description).
*
* @return array Un tableau listant des saisies et leurs options
*/
function saisies_lister_disponibles(){
function saisies_lister_disponibles() {
static $saisies = null;
if (is_null($saisies)){
if (is_null($saisies)) {
$saisies = array();
$liste = find_all_in_path('saisies/', '.+[.]yaml$');
if (count($liste)){
foreach ($liste as $fichier=>$chemin){
if (count($liste)) {
foreach ($liste as $fichier => $chemin) {
$type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
$dossier = str_replace($fichier, '', $chemin);
// On ne garde que les saisies qui ont bien le HTML avec !
@ -263,72 +284,75 @@ function saisies_lister_disponibles(){
and (
is_array($saisie = saisies_charger_infos($type_saisie))
)
){
) {
$saisies[$type_saisie] = $saisie;
}
}
}
}
return $saisies;
}
/**
* Lister les saisies existantes ayant une définition SQL
* Lister les saisies existantes ayant une définition SQL.
*
* @return array Un tableau listant des saisies et leurs options
*/
function saisies_lister_disponibles_sql() {
$saisies = array();
$saisies_disponibles = saisies_lister_disponibles();
foreach ($saisies_disponibles as $type=>$saisie) {
foreach ($saisies_disponibles as $type => $saisie) {
if (isset($saisie['defaut']['options']['sql']) and $saisie['defaut']['options']['sql']) {
$saisies[$type] = $saisie;
}
}
return $saisies;
}
/**
* Charger les informations contenues dans le YAML d'une saisie
* Charger les informations contenues dans le YAML d'une saisie.
*
* @param string $type_saisie Le type de la saisie
*
* @return array Un tableau contenant le YAML décodé
*/
function saisies_charger_infos($type_saisie){
if(defined('_DIR_PLUGIN_YAML')){
function saisies_charger_infos($type_saisie) {
if (defined('_DIR_PLUGIN_YAML')) {
include_spip('inc/yaml');
$fichier = find_in_path("saisies/$type_saisie.yaml");
$saisie = yaml_decode_file($fichier);
if (is_array($saisie)){
$saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
if (is_array($saisie)) {
$saisie['titre'] = (isset($saisie['titre']) and $saisie['titre'])
? _T_ou_typo($saisie['titre']) : $type_saisie;
$saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
$saisie['description'] = (isset($saisie['description']) and $saisie['description'])
? _T_ou_typo($saisie['description']) : '';
$saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
$saisie['icone'] = (isset($saisie['icone']) and $saisie['icone'])
? find_in_path($saisie['icone']) : '';
}
}else
} else {
$saisie = array();
}
return $saisie;
}
/**
* Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun
* Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun.
*
* @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun
*/
function saisies_autonomes(){
function saisies_autonomes() {
$saisies_autonomes = pipeline(
'saisies_autonomes',
array(
'fieldset',
'hidden',
'destinataires',
'explication'
'destinataires',
'explication',
)
);
return $saisies_autonomes;
}

226
inc/saisies_manipuler.php

@ -1,100 +1,110 @@
<?php
/**
* Gestion de l'affichage des saisies
* Gestion de l'affichage des saisies.
*
* @return SPIP\Saisies\Manipuler
**/
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Supprimer une saisie dont on donne l'identifiant, le nom ou le chemin
* Supprimer une saisie dont on donne l'identifiant, le nom ou le chemin.
*
* @param array $saisies
* Tableau des descriptions de saisies
* @param array $saisies
* Tableau des descriptions de saisies
* @param string|array $id_ou_nom_ou_chemin
* L'identifiant unique
* ou le nom de la saisie à supprimer
* ou son chemin sous forme d'une liste de clés
* L'identifiant unique
* ou le nom de la saisie à supprimer
* ou son chemin sous forme d'une liste de clés
*
* @return array
* Tableau modifié décrivant les saisies
* Tableau modifié décrivant les saisies
*/
function saisies_supprimer($saisies, $id_ou_nom_ou_chemin){
function saisies_supprimer($saisies, $id_ou_nom_ou_chemin) {
// Si la saisie n'existe pas, on ne fait rien
if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)){
if ($chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true)) {
// La position finale de la saisie
$position = array_pop($chemin);
// On va chercher le parent par référence pour pouvoir le modifier
$parent =& $saisies;
foreach($chemin as $cle){
$parent =& $parent[$cle];
$parent = &$saisies;
foreach ($chemin as $cle) {
$parent = &$parent[$cle];
}
// On supprime et réordonne
unset($parent[$position]);
$parent = array_values($parent);
}
return $saisies;
}
/**
* Insère une saisie à une position donnée
* Insère une saisie à une position donnée.
*
* @param array $saisies
* Tableau des descriptions de saisies
* Tableau des descriptions de saisies
* @param array $saisie
* Description de la saisie à insérer
* Description de la saisie à insérer
* @param array $chemin
* Position complète où insérer la saisie.
* En absence, insère la saisie à la fin.
* Position complète où insérer la saisie.
* En absence, insère la saisie à la fin.
*
* @return array
* Tableau des saisies complété de la saisie insérée
* Tableau des saisies complété de la saisie insérée
*/
function saisies_inserer($saisies, $saisie, $chemin=array()){
function saisies_inserer($saisies, $saisie, $chemin = array())
{
// On vérifie quand même que ce qu'on veut insérer est correct
if ($saisie['saisie'] and $saisie['options']['nom']){
if ($saisie['saisie'] and $saisie['options']['nom']) {
// ajouter un identifiant
$saisie = saisie_identifier($saisie);
// Par défaut le parent c'est la racine
$parent =& $saisies;
$parent = &$saisies;
// S'il n'y a pas de position, on va insérer à la fin du formulaire
if (!$chemin){
if (!$chemin) {
$position = count($parent);
}
elseif (is_array($chemin)){
} elseif (is_array($chemin)) {
$position = array_pop($chemin);
foreach ($chemin as $cle){
foreach ($chemin as $cle) {
// Si la clé est un conteneur de saisies "saisies" et qu'elle n'existe pas encore, on la crée
if ($cle == 'saisies' and !isset($parent[$cle]))
if ($cle == 'saisies' and !isset($parent[$cle])) {
$parent[$cle] = array();
$parent =& $parent[$cle];
}
$parent = &$parent[$cle];
}
// On vérifie maintenant que la position est cohérente avec le parent
if ($position < 0) $position = 0;
elseif ($position > count($parent)) $position = count($parent);
if ($position < 0) {
$position = 0;
} elseif ($position > count($parent)) {
$position = count($parent);
}
}
// Et enfin on insère
array_splice($parent, $position, 0, array($saisie));
}
return $saisies;
}
/**
* Duplique une saisie (ou groupe de saisies)
* en placant la copie à la suite de la saisie d'origine.
* Modifie automatiquement les identifiants des saisies
* Modifie automatiquement les identifiants des saisies.
*
* @param array $saisies Un tableau décrivant les saisies
* @param array $saisies Un tableau décrivant les saisies
* @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie a dupliquer
*
* @return array Retourne le tableau modifié des saisies
*/
function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin){
function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin)
{
// On récupère le contenu de la saisie à déplacer
$saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
if ($saisie) {
@ -102,13 +112,13 @@ function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin){
// insertion apres quoi ?
$chemin_validation = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
// 1 de plus pour mettre APRES le champ trouve
$chemin_validation[count($chemin_validation)-1]++;
++$chemin_validation[count($chemin_validation) - 1];
// On ajoute "copie" après le label du champs
$clone['options']['label'] .= ' '._T('saisies:construire_action_dupliquer_copie');
// Création de nouveau identifiants pour le clone
$clone = saisie_identifier($clone, true);
$saisies = saisies_inserer($saisies, $clone, $chemin_validation);
}
@ -116,84 +126,89 @@ function saisies_dupliquer($saisies, $id_ou_nom_ou_chemin){
}
/**
* Déplace une saisie existante autre part
* Déplace une saisie existante autre part.
*
* @param array $saisies Un tableau décrivant les saisies
* @param array $saisies Un tableau décrivant les saisies
* @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à déplacer
* @param string $ou Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur]
* @param string $ou Le nom de la saisie devant laquelle on déplacera OU le nom d'un conteneur entre crochets [conteneur]
*
* @return array Retourne le tableau modifié des saisies
*/
function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou){
function saisies_deplacer($saisies, $id_ou_nom_ou_chemin, $ou)
{
// On récupère le contenu de la saisie à déplacer
$saisie = saisies_chercher($saisies, $id_ou_nom_ou_chemin);
// Si on l'a bien trouvé
if ($saisie){
if ($saisie) {
// On cherche l'endroit où la déplacer
// Si $ou est vide, c'est à la fin de la racine
if (!$ou){
if (!$ou) {
$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
$chemin = array(count($saisies));
}
// Si l'endroit est entre crochet, c'est un conteneur
elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)){
elseif (preg_match('/^\[(@?[\w]*)\]$/', $ou, $match)) {
$parent = $match[1];
// Si dans les crochets il n'y a rien, on met à la fin du formulaire
if (!$parent){
if (!$parent) {
$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
$chemin = array(count($saisies));
}
// Sinon on vérifie que ce conteneur existe
elseif (saisies_chercher($saisies, $parent, true)){
elseif (saisies_chercher($saisies, $parent, true)) {
// S'il existe on supprime la saisie et on recherche la nouvelle position
$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
$parent = saisies_chercher($saisies, $parent, true);
$chemin = array_merge($parent, array('saisies', 1000000));
}
else
} else {
$chemin = false;
}
}
// Sinon ça sera devant un champ
else{
else {
// On vérifie que le champ existe
if (saisies_chercher($saisies, $ou, true)){
if (saisies_chercher($saisies, $ou, true)) {
// S'il existe on supprime la saisie
$saisies = saisies_supprimer($saisies, $id_ou_nom_ou_chemin);
// Et on recherche la nouvelle position qui n'est plus forcément la même maintenant qu'on a supprimé une saisie
$chemin = saisies_chercher($saisies, $ou, true);
}
else
} else {
$chemin = false;
}
}
// Si seulement on a bien trouvé un nouvel endroit où la placer, alors on déplace
if ($chemin)
if ($chemin) {
$saisies = saisies_inserer($saisies, $saisie, $chemin);
}
}
return $saisies;
}
/**
* Modifie une saisie
* Modifie une saisie.
*
* @param array $saisies Un tableau décrivant les saisies
* @param array $saisies Un tableau décrivant les saisies
* @param unknown_type $id_ou_nom_ou_chemin L'identifiant unique ou le nom ou le chemin de la saisie à modifier
* @param array $modifs Le tableau des modifications à apporter à la saisie
* @param array $modifs Le tableau des modifications à apporter à la saisie
*
* @return Retourne le tableau décrivant les saisies, mais modifié
*/
function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs){
function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs)
{
$chemin = saisies_chercher($saisies, $id_ou_nom_ou_chemin, true);
$position = array_pop($chemin);
$parent =& $saisies;
foreach ($chemin as $cle){
$parent =& $parent[$cle];
$parent = &$saisies;
foreach ($chemin as $cle) {
$parent = &$parent[$cle];
}
// On récupère le type tel quel
$modifs['saisie'] = $parent[$position]['saisie'];
// On récupère le nom s'il n'y est pas
if (!isset($modifs['options']['nom'])){
if (!isset($modifs['options']['nom'])) {
$modifs['options']['nom'] = $parent[$position]['options']['nom'];
}
// On récupère les enfants tels quels s'il n'y a pas des enfants dans la modif
@ -201,7 +216,7 @@ function saisies_modifier($saisies, $id_ou_nom_ou_chemin, $modifs){
!isset($modifs['saisies'])
and isset($parent[$position]['saisies'])
and is_array($parent[$position]['saisies'])
){
) {
$modifs['saisies'] = $parent[$position]['saisies'];
}