Formulaire générique d'édition de méta #SPIP

10 November 2016

L’idée derrière ce formulaire est assez simple, pouvoir gérer n’importe quelle valeur de la table spip_metas et la modifiée. Si elle n’existe pas, la méta sera crée.

Il convient de prendre en compte qu’il y a 2 types de méta dans spip :

  • les métas simples, le casier ne contient qu’une seul valeur .
  • les métas plus complexent qui sont des tableaux php sérialisé.

Cela couvre un besoin similaire à Identité Extra, mais de manière plus générique.

L’idée finale serait d’avoir un plugin de gestion des métas du site (et donc des options des plugins) plus générique et plus facile d’accès. Je trouve qu’il pourrait être plus simple de déclarer des options de plugin sans avoir a déclaré systématiquement un CVT complet.

Fichier formulaires/editer_meta.html :

<div class="formulaire_spip formulaire_#FORM">

    [<p class="reponse_formulaire reponse_formulaire_erreur">
    (#ENV*{message_erreur})
    </p>]
    [<p class="reponse_formulaire reponse_formulaire_ok">
        (#ENV*{message_ok})
    </p>]

    [(#EDITABLE|oui)
    <form action="#ENV{action}" method="post">
        #ACTION_FORMULAIRE{#ENV{action}}

        #GENERER_SAISIES{#ENV{_saisies}}

        <p class="boutons">
            <input type="submit" class="submit" value="<:pass_ok:>" />
        </p>
    </form>
    ]
</div>

fichier formulaires/editer_meta.php :

<?php
if (!defined('_ECRIRE_INC_VERSION')) {
    return;
}

/**
 * Fonction saisie pour le formulaire d'édition générique de méta
 *
 * @param string $casier nom du meta casier
 * @param string $meta nom de l'éventuel sous-méta
 * @param array $options tableau d'options :
 *
 * ```php
 * $options_defaut = array(
 *      'type_saisie' => 'input',
 *      'label' => 'label'
 * );
 * ```
 *
 * @access public
 * @return array
 */
function formulaires_editer_meta_saisies_dist($casier, $meta = null, $options = array()) {

    // option par défaut
    $options_defaut = array(
        'type_saisie' => 'input',
        'label' => 'label'
    );
    // Fusionner les options par défaut avec les options de l'utilisateur
    $options = array_merge($options_defaut, $options);

    // Récupérer le meta casier et créer sa saisie
    $casier = ($meta) ? $casier.'/'.$meta : $casier;
    $saisies = array(
        array(
            'saisie' => $options['type_saisie'],
            'options' => array(
                'nom' => $casier,
                'label' => $options['label']
            )
        )
    );

    return $saisies;
}

/**
 * Fonction charger pour le formulaire d'édition générique de méta
 *
 * @param string $casier nom du meta casier
 * @param string $meta nom de l'éventuel sous-méta
 * @param array $options tableau d'options :
 *
 * ```php
 * $options_defaut = array(
 *      'type_saisie' => 'input',
 *      'label' => 'label'
 * );
 * ```
 *
 * @access public
 * @return array
 */
function formulaires_editer_meta_charger_dist($casier, $meta = null, $options = array()) {
    // Récupérer le casier
    $casier = ($meta) ? $casier.'/'.$meta : $casier;

    // Lire la configuration
    include_spip('inc/config');
    $contexte = lire_config($casier, array());

    // Dans le cas d'une saisie simple, on s'assure de renvoyer un tableau
    // valide pour la fonction charger
    if (!is_array($contexte)) {
        $contexte = array($casier => $contexte);
    }

    return $contexte;
}

/**
 * Fonction traiter pour le formulaire d'édition générique de méta
 *
 * @param string $casier nom du meta casier
 * @param string $meta nom de l'éventuel sous-méta
 * @param array $options tableau d'options :
 *
 * ```php
 * $options_defaut = array(
 *      'type_saisie' => 'input',
 *      'label' => 'label'
 * );
 * ```
 *
 * @access public
 * @return array
 */
function formulaires_editer_meta_traiter_dist($casier, $meta = null, $options = array()) {

    // Enregistrer la méta
    include_spip('inc/config');

    // Récupérer l'ancienne configuration du casier
    $old_config = lire_config($casier);
    if (is_array($old_config)) {
        // Dans le cas d'une méta complexe, on va fusionner les fusionner avec
        // la nouvelle
        $new_config = _request($casier);
        $new_config = array_merge($old_config, $new_config);
    } else {
        // Cas d'une saisie simple, on enregistre simplement la meta
        $new_config = _request($casier);
    }

    // Ecrire la nouvelle méta
    $ecrire = ecrire_config($casier, $new_config);

    // Retour du formulaire
    if ($ecrire) {
        return array(
            'editable' => true,
            'message_ok' => _T('info_modification_enregistree')
        );
    } else {
        return array(
            'editable' => true,
            'message_erreur' => _T('erreur')
        );
    }
}