Note : n’oubliez pas de remplacer prefixe
par le préfixe de votre plugin.
Créer la fonction qui va déclarer les nouveaux champs
Dans cette première partie, on ajoute simplement un champ date
aux articles du secteur 1 et un champ textarea
aux rubriques de la branche 5. Pour voir d’autres types de champs, rendez-vous dans la partie Déclarer d’autres types de champs extras.
Créer un fichier /base/prefixe.php
contenant le code suivant :
<?php
// Sécurité
if (!defined("_ECRIRE_INC_VERSION")) return;
function prefixe_declarer_champs_extras($champs = array()) {
// SAISIE DATE SUR L'OBJET ARTICLE DU SECTEUR 1
$champs['spip_articles']['date_diffusion'] = array(
// Le type de saisie
'saisie' => 'date',
'options' => array(
// Le nom du champ dans la base de données
'nom' => 'date_diffusion',
// Le label affiché dans l'espace privé du site
'label' => _T('prefixe:chaine_de_langue_date_diffusion'),
// L'explication affichée dans l'espace privé du site
'explication' => _T('prefixe:chaine_de_langue_date_diffusion_explication'),
// Le type d'info attendue
'sql' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
// La valeur par défaut
'defaut' => '',
// Le champ est obligatoire
'obligatoire' => 'oui',
// Afficher ce champ uniquement pour les articles du secteur n°1
'restrictions'=>array(
'secteur' => '1'
),
),
// Vérifier et normaliser les infos saisies avant de les insérer dans la base
'verifier' => array(
'type' => 'date',
'options' => array(
'normaliser' => 'datetime',
)
)
);
// SAISIE TEXTEAREA SUR L'OBJET RUBRIQUE DE LA BRANCHE N°5
$champs['spip_rubriques']['infos_complementaires'] = array(
'saisie' => 'textarea',
'options' => array(
'nom' => 'infos_complementaires',
'label' => _T('prefixe:chaine_de_langue_infos_complementaires'),
'defaut' => '',
// Nombre de ligne du champ dans l'espace privé
'rows' => 10,
// Insérer la barre d'outils type forum
'inserer_barre' => 'forum',
// Appliquer les traitements typographiques et raccourcis SPIP à l'affichage du champ
'traitements' => '_TRAITEMENT_RACCOURCIS',
'sql' => "text DEFAULT '' NOT NULL",
// Afficher ce champ uniquement pour les articles de la branche n°5
'restrictions'=>array(
'branche' => '5'
),
)
);
return $champs;
}
Indiquer au plugin de mettre à jour la base
Créer un fichier /prefixe_administrations.php
contenant le code suivant :
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// Inclure l'API Champs Extras
include_spip('inc/cextras');
// Inclure les champs déclarés à l'étape précédente
include_spip('base/prefixe');
function prefixe_upgrade($nom_meta_base_version,$version_cible) {
$maj = array();
// Première déclaration à l'installation du plugin
cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj['create']);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
// Désinstaller proprement le plugin en supprimant les champs de la base de données
function prefixe_vider_tables($nom_meta_base_version) {
cextras_api_vider_tables(prefixe_declarer_champs_extras());
effacer_meta($nom_meta_base_version);
}
Si vous ajoutez des champs extras une fois votre plugin installé et en fonctionnement, vous devez déclarer ces mises à jour en les ajoutant au code ci-dessus (après la première déclaration $maj['create']
) :
// Ajout d'un nouveau ou plusieurs champs
cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj['0.1.1']);
// Encore un ajout de nouveaux champs
cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj['0.1.2']);
Si vous supprimez des champs, par exemple la date, indiquer à votre plugin de les supprimer de la base :
// Supprimer des champs
cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj['1.2.0']);
$maj['1.2.0'][] = array('sql_alter',"TABLE spip_articles DROP date_nom");
Note : la valeur $maj['0.1.1']
doit correspondre avec le schema déclaré plus loin dans paquet.xml
.
Dans votre paquet.xml
Dernière étape : pour que tout ça soit pris en compte, vous devez modifier votre fichier paquet.xml
.
Indiquer que le plugin doit mettre à jour la base
Ajouter schema="0.1.0"
dans la balise <paquet>
afin que votre plugin mette à jour la base de données.
Puis, à chaque ajout ou surpression d’un champ, monter d’une version que le changement soit pris en compte.
Déclarer le pipeline champs extras
Enfin, déclarer le pipeline declarer_champs_extras
:
<pipeline nom="declarer_champs_extras" inclure="base/prefixe.php" />
Déclarer les dépendances
Pour que ça fonctionne, votre plugin nécessite désormais 3 autres plugins :
- Champs Extras 3 pour gérer les champs en base
- Saisies pour gérer les saisies (interface avec la base)
- Vérifier pour vérifier les infos saisies avant de les rentrer en base
Ajouter ces nécessites :
<necessite nom="cextras" compatibilite="[3.0.5;]" />
<necessite nom="saisies" compatibilite="[3.2.0;]" />
<necessite nom="verifier" compatibilite="[1.8.0;]" />
Note : l’article ayant été écrit en mai/juin 2020, il sera peut-être nécessaire de mettre à jour les compatibilite
.
Récapitulatif paquet.xml
Votre fichier paquet.xml
doit désormais ressembler à ça :
<paquet
prefix="prefixe"
categorie="squelette"
version="1.0.0"
etat="stable"
compatibilite="[3.2.0;3.3.*]"
logo="prive/themes/spip/images/prefixe-32.png"
documentation="https://www.domaine.net"
schema="0.1.0"
>
<nom>Nom de votre Plugin</nom>
<pipeline nom="declarer_champs_extras" inclure="base/prefixe.php" />
<necessite nom="cextras" compatibilite="[3.0.5;]" />
<necessite nom="saisies" compatibilite="[3.2.0;]" />
<necessite nom="verifier" compatibilite="[1.8.0;]" />
</paquet>
Déclarer d’autres types de champs extras
Voici un exemple plus complet :
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function prefixe_declarer_champs_extras($champs = array()) {
// SAISIE RADIO SUR L'OBJET ARTICLE
$champs['spip_articles']['type_structure'] = array(
'saisie' => 'radio',
'options' => array(
'nom' => 'structure',
'label' => _T('prefixe:type_structure_label'),
'explication' => _T('prefixe:type_structure_explication'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',
// Les boutons radio
'datas' => array(
'' => _T('prefixe:champ_vide'),
'structure_adherente' => _T('prefixe:type_structure_adherente'),
'structure_non_adherente' => _T('prefixe:type_structure_non_adherente'),
),
)
);
// SAISIE CHECKBOX SUR L'OBJET RUBRIQUE DES SECTEURS N°1 et N°2
$champs['spip_rubriques']['jour_de_diffusion'] = array(
'saisie' => 'checkbox',
'options' => array(
'nom' => 'jour_diffusion_emission',
'label' => _T('prefixe:jour_de_diffusion'),
'sql' => "text DEFAULT '' NOT NULL",
'defaut' => '',
'restrictions'=>array(
'secteur' => '1:2',
// Autorisation : Tous les auteurs peuvent voir ce champ
'voir' => array('auteur' => ''),
// Autorisation : Seuls les admins complets peuvent le modifier
'modifier' => array('auteur' => 'admin_complet')
),
// Les cases checkbox
'datas'=>array(
'lundi' => 'Lundi',
'mardi' => 'Mardi',
'mercredi' => 'Mercredi',
'jeudi' => 'Jeudi',
'vendredi' => 'Vendredi',
'samedi' => 'Samedi',
'dimanche' => 'Dimanche'
),
)
);
// 2 SAISIES DANS UN FIELDSET POUR L'OBJET AUTEUR
$champs['spip_auteurs']['fieldset_numeros'] = array(
'saisie' => 'fieldset',
'options' => array(
'nom' => "fieldset_numeros",
'label' => _T('prefixe:chaine_de_langue_fieldset_numeros')
),
'saisies' => array(
// SAISIE INPUT SUR L'OBJET AUTEUR
'telephone' => array(
'saisie' => 'input',
'options' => array(
'nom' => 'telephone',
'label' => _T('prefixe:chaine_de_langue_telephone'),
// Texte indicatif
'placeholder' => _T('prefixe:chaine_de_langue_placeholder'),
// Limiter ce champ à 30 caractères
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',
),
// Vérifier que les données saisies correspondent à un numéro de téléphone
'verifier' => array(
'type' => 'telephone'
)
),
'fax' => array(
'saisie' => 'input',
'options' => array(
'nom' => 'fax',
'label' => _T('prefixe:chaine_de_langue_fax'),
// Limiter ce champ à 30 caractères
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',
),
// Vérifier que les données saisies correspondent à un numéro de téléphone
'verifier' => array(
'type' => 'telephone'
)
)
)
);
// SAISIE SÉLECTEUR D'ARTICLE
$champs['spip_articles']['voir_aussi'] = array(
'saisie' => 'selecteur_article',
'options' => array(
'nom' => 'voir_aussi',
'label' => _T('prefixe:voir_aussi_label'),
'explication' => _T('prefixe:voir_aussi_explication'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
// Possibilité de choisir plusieurs articles
'multiple' => true,
)
);
return $champs;
}
Discussions par date d’activité
2 discussions
Merci, effectivement, j’ai :
J’ai pourtant bien mon
en début de fichier prefixe_administrations.php (et d’ailleurs les mises à jour du plugin ne plantent pas, donc cette inclusion semble bien prise en compte à ce moment).
On dirait justement que l’include n’est pas pris en compte à l’installation et à la désinstallation du plugin. Mais pourquoi ?? Même en le plaçant à l’intérieur des fonctions ça plante...
Parce que c’est
include_spip('base/prefixe');
qu’il faudrait avoir ? sans le .phpRho... nom d’un spip :-) C’est bien de faire des pauses des fois...
Oui ;, c’était ça bien sûr et c’est pourtant bien écrit dans la doc d’include_spip.
Merci et encore désolé pour le dérangement...
Répondre à ce message
Bonjour,
SPIP 4.2.6 / Champs Extras 4.1.2
Quand j’installe un plugin ($maj[’create’]) ou que je le désinstalle, j’ai une formidable erreur 500 avec cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj[’create’]), de même qu’avec cextras_api_vider_tables(prefixe_declarer_champs_extras()).
Si je met directement un tableau $champs_extras au lieu de prefixe_declarer_champs_extras(), ça fonctionne.
De même que les mises à jour cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj[’x.y.z’]) fonctionnent également.
Enfin, lors d’une désinstallation du plugin, ça plante, mais un petit refresh au bout d’une dizaine de seconde... et ça marche !
On dirait qu’à priori, le pipeline prefixe_declarer_champs_extras fait planter tout ça uniquement à l’installation et à la désinstallation.
Est-ce que c’est moi ou bien quelqu’un a déjà rencontré le même problème ? Je peux le contourner come expliqué (déclarer directement mes champs extras dans prefixe_upgrade() bien sûr, mais ce n’est pas très... moral ? :-)
Merci pour vos lumières.
« Ca plante » « ca marche » faudrait préciser le « comment ca plante » et « comment ca marche ».
Ça plante sur une erreur 500 lorsque j’installe ou desinstalle le plugin.
Et quand ça marche c’est comme il se doit : champs extras créés ou supprimés conformément aux lignes de commande cextras_api_upgrade(prefixe_declarer_champs_extras(), $maj[’create’]) ou cextras_api_vider_tables(prefixe_declarer_champs_extras()).
Et comme je l’écrivais, quand on fait un refresh quelques secondes plus tard sur une erreur 500 à la désinstallation, celle-ci disparaît et le plugins est correctement desinstallé.
En résumé, le pipeline prefixe_declarer_champs_extras() ne semble pas fonctionner à tous les coups.
Erreur 500 -> PHP qui foire. Il faudrait que tu consulte les logs PHP pour en savoir plus.
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |