Modification des tables spip avec un plugin

Bonjour,

Dans l’objectif de faire un plugin spip, je souhaite ajouter des tables et en modifier dans la base de donnés spip. Voici mon problème, même si j’arrive à ajouter de nouvelle table, quand il s’agit de rajouter une colonne à une table existante (ici rubriques), cela ne fonctionne pas.

Voici les parties en rapport avec cette modification :

Dans le fichier _administration.php dans la fonction upgrade

      $maj['create'] = array(
		array('maj_tables', array('spip_rubriques','spip_projets', 'spip_auteur_projet')),
	);


	$maj['1.0.2'] = array(
        array('sql_alter', "TABLE spip_rubriques ADD COLUMN id_projet BIGINT(21) DEFAULT '0' NOT NULL")
    );
	

et dans le fichier _tables.php dans declarer_tables_objets_sql

      if (!isset($tables['spip_rubriques']['field']['id_projet'])) {
		$tables['spip_rubriques']['field']['id_projet'] = 'bigint(21) NOT NULL DEFAULT "0"';
		$tables['spip_rubriques']['champs_editables'][] = 'id_projet';
		$tables['spip_rubriques']['champs_versionnes'][] = 'id_projet';
	}

Je ne sais pas si les deux modifications sont indispensables, mais dans tous les cas je ne comprends pas pourquoi la colonne ne s’ajoute pas lors de l’activation du plugin.

Si vous avez une idée sur cette problématique je veux bien l’entendre.
Sinon passez une bonne journée.

Tu peux utiliser l’API de champs extras pour ça, voir ce plugin d’exemple spip-contrib-extensions / champs_extras_extension_date_rubriques · GitLab

En complément de tes déclarations dans le fichier _administration.php il faut aussi informer SPIP des mises à jour des tables de la BDD.
Une méthode simple est d’utiliser le pipeline declarer_tables_principales (cf declarer_tables_principales - Programmer avec SPIP 4).
Pour un exemple complet et fonctionnel voir par ex la maj 1.0.2 du plugin grigri :

A noter que pour déclencher un upgrade de BDD, il faut :

Et pour pouvoir rejouer une mise à jour, ce qui est utile quand on dév / teste :

  • modifier dans la table spip_meta la valeur de prefixe_base_version (par exemple repasser grigri_base_version de 1.0.7 à 1.0.6)
  • supprimer /temp/meta_cache.php
  • appeler la page de gestion des plugins ( ecrire/?exec=admin_plugin)

Alors ce qui est génant c’est que malgrès cela lors de l’installation cela ne fait pas les modifications. J’ai beau déclarer dans un fichier prefixe_tables.php

function osi_projets_declarer_tables_auxiliaires($tables_auxiliaires) {
	$tables_auxiliaires['spip_rubriques']['field']['id_projet'] = "bigint(21) NOT NULL DEFAULT '0'";
	$tables_auxiliaires['spip_mots_liens']['field']['lien_projet'] = "bigint(21) NOT NULL DEFAULT '0'";

	return $tables_auxiliaires;
}

Le plugin Pages Uniques qui rajoute une colonne à spip_articles semble se limiter à cela. Je ne comprends pas vraiment pourquoi ca ne fonctionne pas pour moi ? :thinking: :smiling_face_with_tear:

Le plugin utilise le pipeline tables_objets_sql

déclaré dans le paquet.xml :

Tu as bien un appel aussi à une mise à jour de la table dans _administations.php ?

En fait, comme tu travailles sur des objets éditoriaux (rubriques et mots) il me semble qu’il faut utiliser tables_objets_sql qui travaille sur les objets (spip_mots, spip_rubriques etc), plutôt que declarer_tables_auxiliaires qui travaille sur les tables de liens (spip_mots_liens, etc)
Ça doit être ce qui ne fonctionne pas, si tout le reste est ok.