[spip-dev] ! Declaration d'objets par le pipeline declarer_tables_objets_sql

Hello,
j’ai repris les travaux initiés par Quentin sur le gouverneur, pour proposer une déclaration unifiée des objets intégrée dans le noyau de la version de développement,
et qui permet a chaque plugin de déclarer ses objets éditoriaux.

Le pipeline declarer_tables_objets_sqlpermet de declarer les objets editoriaux et leur table SQL.
Il voit passer un tableau associatif dont la clé est le nom SQL de la table (ex : spip_articles)

Pour chaque table, les informations attendues sont listées ci-dessous.
Les infos non renseignées dans le pipeline sont ensuite complétées par une valeur par défaut qui correspond au cas général conventionnel.

Dans SPIP, la liste des informations est ensuite accessible de plusieurs façons :

  • pour avoir les informations déclarées :
    include_spip(‹ base/objets ›);
    lister_tables_objets_sql(); // pour avoir tout le tableau de données de toutes les tables
    lister_tables_objets_sql(‹ spip_articles ›); // pour avoir les infos de la table spip_articles uniquement

  • pour avoir en plus les informations de la description SQL de la table il faut passer par base/trouver_table:
    $trouver_table = charger_fonction(‹ trouver_table ›,‹ base ›);
    $trouver_table(‹ spip_articles ›);
    qui lit la description en base de la table, et l’enrichit du contenu de lister_tables_objets_sql

  • pour utiliser une information précise le filtre info_objet :
    echo _T(info_objet(‹ article ›,‹ texte_objet ›));
    ou dans un squelette :
    [(#OBJET|info_objet{texte_objet}|_T)]
    ce filtre utilise l’objet en entrée car c’est ce dont on dispose en général dans les squelettes.

Information fournies dans le pipeline (voir le tableau complet en exemple ci-dessous pour plus de détail) :

type type de l’objet (par defaut nom de la table sans spip_ ni s à la fin)
type_surnoms surnoms utiles pour retrouver le type (vide par defaut)
table_objet nom abrege de la table (nom de la table SQL sans spip_ par defaut)
table_objet_surnom surnoms pour retrouver table_objet (vide par defaut)
principale true/false (true par defaut si la table est dans la globale $tables_principales, false sinon)
editable si l’objet est editable

page vide si il ne faut pas decoder l’url ?article23 et nom du squelette publique sinon (article / seul page=type est fonctionnel pour le moment)
url_voir nom de l’exec pour voir l’objet dans l’espace prive ("$type" par defaut)
url_edit nom de l’exec pour editer l’objet dans l’espace prive ($type."_edit" par defaut)

icone_objet nom de l’icone utilisee pour illustrer l’objet. Seule la racine du nom est fournie, par defaut egale au type, l’image etant ensuite completee par la taille et l’extension en fonction de l’usage
texte_retour chaine de langue pour linker le retour à l’objet ("$type:icone_retour_$type" par defaut)
texte_modifier chaine de langue pour linker l’edition de l’objet ("$type:icone_modifier_$type" par defaut)
texte_objet chaine de langue pour afficher le nom de l’objet (Article) (par defaut « $type:titre_$type »)

texte_objets chaine de langue pour afficher le nom de la famille d’objet, en general le pluriel du precedent (Articles) (par defaut « $type:titre_$table_objet »)

info_aucun_objet chaine de langue pour afficher « Aucun objet » (par defaut « $type:info_aucun_$type »)

info_1_objet chaine de langue pour afficher « 1 objet » (par defaut « $type:info_1_$type »)

info_nb_objet chaine de langue pour afficher « @nb@ objets » (par defaut « $type:info_nb_$table_objet »)

titre selection sql pour recuperer titre et langue, anciennement declare dans la globale table_titre (vide par defaut)
date champ date pour les criteres de date, anciennement dans la globale table_date (vide par defaut)
field liste des champs de la table, anciennement dans tables_principales ou tables_auxiliaires (par defaut vide, renseignes quand on passe par trouver_table)
key liste des cles de la table, anciennement dans tables_principales ou tables_auxiliaires (par defaut vide, renseignes quand on passe par trouver_table)
join liste des cles de jointures de la table, anciennement dans tables_principales ou tables_auxiliaires (par defaut vide, renseignes quand on passe par trouver_table)

champs_versionnes listes des champs pris en compte par les revisions
rechercher_champs liste des champs utilises pour la recherche en base (anciennement declare via le pipeline rechercher_liste_des_champs) (par defaut vide)

rechercher_jointures liste des jointures pour la recherche en base (anciennement declare via le pipeline rechercher_liste_des_jointures) (par defaut vide)

Toutes les déclarations réalisées auparavant via
les globales table_titre, table_date, table_principale, table_auxiliaire,
les pipelines rechercher_liste_des_champs, rechercher_liste_des_jointures, declarer_tables_objets_surnoms, declarer_type_surnoms
restent fonctionnelles.
Les pipeline voient passer les information déjà déclarées dans le pipeline declarer_tables_objets_sql

Il est fortement conseillé de migrer vers cette déclaration unifiée plus complète, qui pourra s’enrichir, et permet de faire bénéficier les objets concernés de fonctionnalités généralisées.
Par exemple, tous les objets ainsi déclarés peuvent d’ores et déjà recevoir des documents joints et des mots clés.

array

  'spip_articles' => 
    **array**
      'page' => <small>string</small> 'article' *(length=7)*
      'texte_retour' => <small>string</small> 'icone_retour_article' *(length=20)*
      'texte_modifier' => <small>string</small> 'icone_modifier_article' *(length=22)*
      'texte_objets' => <small>string</small> 'public:articles' *(length=15)*
      'texte_objet' => <small>string</small> 'public:article' *(length=14)*
      'texte_signale_edition' => <small>string</small> 'texte_travail_article' *(length=21)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_article' *(length=18)*
      'info_1_objet' => <small>string</small> 'info_1_article' *(length=14)*
      'info_nb_objets' => <small>string</small> 'info_nb_articles' *(length=16)*
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'id_rubrique' *(length=11)*
          1 => <small>string</small> 'surtitre' *(length=8)*
          2 => <small>string</small> 'titre' *(length=5)*
          3 => <small>string</small> 'soustitre' *(length=9)*
          4 => <small>string</small> 'j_mots' *(length=6)*
          5 => <small>string</small> 'descriptif' *(length=10)*
          6 => <small>string</small> 'nom_site' *(length=8)*
          7 => <small>string</small> 'url_site' *(length=8)*
          8 => <small>string</small> 'chapo' *(length=5)*
          9 => <small>string</small> 'texte' *(length=5)*
          10 => <small>string</small> 'ps' *(length=2)*
      'rechercher_champs' => 
        **array**
          'surtitre' => <small>int</small> 5
          'titre' => <small>int</small> 8
          'soustitre' => <small>int</small> 5
          'chapo' => <small>int</small> 3
          'texte' => <small>int</small> 1
          'ps' => <small>int</small> 1
          'nom_site' => <small>int</small> 1
          'url_site' => <small>int</small> 1
          'descriptif' => <small>int</small> 4
      'rechercher_jointures' => 
        **array**
          'auteur' => 
            **array**
              'nom' => <small>int</small> 10
          'document' => 
            **array**
              'titre' => <small>int</small> 2
              'descriptif' => <small>int</small> 1
      'type' => <small>string</small> 'article' *(length=7)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'articles' *(length=8)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'url_voir' => <small>string</small> 'article' *(length=7)*
      'url_edit' => <small>string</small> 'article_edit' *(length=12)*
      'icone_objet' => <small>string</small> 'article' *(length=7)*
      'titre' => <small>string</small> 'titre, lang' *(length=11)*
      'date' => <small>string</small> 'date' *(length=4)*
  'spip_auteurs' => 
    **array**
      'page' => <small>string</small> 'auteur' *(length=6)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_modifier' => <small>string</small> 'admin_modifier_auteur' *(length=21)*
      'texte_objets' => <small>string</small> 'icone_auteurs' *(length=13)*
      'texte_objet' => <small>string</small> 'public:auteur' *(length=13)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_auteur' *(length=17)*
      'info_1_objet' => <small>string</small> 'info_1_auteur' *(length=13)*
      'info_nb_objets' => <small>string</small> 'info_nb_auteurs' *(length=15)*
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'nom' *(length=3)*
          1 => <small>string</small> 'bio' *(length=3)*
          2 => <small>string</small> 'email' *(length=5)*
          3 => <small>string</small> 'nom_site' *(length=8)*
          4 => <small>string</small> 'url_site' *(length=8)*
          5 => <small>string</small> 'login' *(length=5)*
      'rechercher_champs' => 
        **array**
          'nom' => <small>int</small> 5
          'bio' => <small>int</small> 1
          'email' => <small>int</small> 1
          'nom_site' => <small>int</small> 1
          'url_site' => <small>int</small> 1
          'login' => <small>int</small> 1
      'type' => <small>string</small> 'auteur' *(length=6)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'auteurs' *(length=7)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'url_voir' => <small>string</small> 'auteur' *(length=6)*
      'url_edit' => <small>string</small> 'auteur_edit' *(length=11)*
      'icone_objet' => <small>string</small> 'auteur' *(length=6)*
      'titre' => <small>string</small> 'nom AS titre, '' AS lang' *(length=24)*
      'date' => <small>string</small> 'date' *(length=4)*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_rubriques' => 
    **array**
      'page' => <small>string</small> 'rubrique' *(length=8)*
      'url_voir' => <small>string</small> 'naviguer' *(length=8)*
      'url_edit' => <small>string</small> 'rubriques_edit' *(length=14)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'public:rubriques' *(length=16)*
      'texte_objet' => <small>string</small> 'public:rubrique' *(length=15)*
      'texte_modifier' => <small>string</small> 'icone_modifier_rubrique' *(length=23)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_rubrique' *(length=19)*
      'info_1_objet' => <small>string</small> 'info_1_rubrique' *(length=15)*
      'info_nb_objets' => <small>string</small> 'info_nb_rubriques' *(length=17)*
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'titre' *(length=5)*
          1 => <small>string</small> 'descriptif' *(length=10)*
          2 => <small>string</small> 'texte' *(length=5)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 8
          'descriptif' => <small>int</small> 5
          'texte' => <small>int</small> 1
      'rechercher_jointures' => 
        **array**
          'document' => 
            **array**
              'titre' => <small>int</small> 2
              'descriptif' => <small>int</small> 1
      'type' => <small>string</small> 'rubrique' *(length=8)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'rubriques' *(length=9)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'icone_objet' => <small>string</small> 'rubrique' *(length=8)*
      'titre' => <small>string</small> 'titre, lang' *(length=11)*
      'date' => <small>string</small> 'date' *(length=4)*
  'spip_forum' => 
    **array**
      'table_objet' => <small>string</small> 'forums' *(length=6)*
      'type' => <small>string</small> 'forum' *(length=5)*
      'url_voir' => <small>string</small> 'controler_forum' *(length=15)*
      'url_edit' => <small>string</small> 'controler_forum' *(length=15)*
      'editable' => <small>boolean</small> false
      'principale' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> '' *(length=0)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'forum' *(length=5)*
      'texte_objet' => <small>string</small> 'forum' *(length=5)*
      'info_aucun_objet' => <small>string</small> 'forum:aucun_message_forum' *(length=25)*
      'info_1_objet' => <small>string</small> 'forum:info_1_message_forum' *(length=26)*
      'info_nb_objets' => <small>string</small> 'forum:info_nb_message_forum' *(length=27)*
      'titre' => <small>string</small> 'titre, '' AS lang' *(length=17)*
      'date' => <small>string</small> 'date_heure' *(length=10)*
      'field' => 
        **array**
          'id_forum' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'id_objet' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'objet' => <small>string</small> 'VARCHAR (25) DEFAULT '' NOT NULL' *(length=32)*
          'id_parent' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'id_thread' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'date_heure' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'date_thread' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'texte' => <small>string</small> 'mediumtext DEFAULT '' NOT NULL' *(length=30)*
          'auteur' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'email_auteur' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'nom_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'url_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'statut' => <small>string</small> 'varchar(8) DEFAULT '0' NOT NULL' *(length=31)*
          'ip' => <small>string</small> 'varchar(40) DEFAULT '' NOT NULL' *(length=31)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
          'id_auteur' => <small>string</small> 'bigint DEFAULT '0' NOT NULL' *(length=27)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_forum' *(length=8)*
          'KEY id_auteur' => <small>string</small> 'id_auteur' *(length=9)*
          'KEY id_parent' => <small>string</small> 'id_parent' *(length=9)*
          'KEY id_thread' => <small>string</small> 'id_thread' *(length=9)*
          'KEY optimal' => <small>string</small> 'statut,id_parent,id_objet,objet,date_heure' *(length=42)*
      'join' => 
        **array**
          'id_forum' => <small>string</small> 'id_forum' *(length=8)*
          'id_parent' => <small>string</small> 'id_parent' *(length=9)*
          'id_article' => <small>string</small> 'id_article' *(length=10)*
          'id_breve' => <small>string</small> 'id_breve' *(length=8)*
          'id_message' => <small>string</small> 'id_message' *(length=10)*
          'id_syndic' => <small>string</small> 'id_syndic' *(length=9)*
          'id_rubrique' => <small>string</small> 'id_rubrique' *(length=11)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 3
          'texte' => <small>int</small> 1
          'auteur' => <small>int</small> 2
          'email_auteur' => <small>int</small> 2
          'nom_site' => <small>int</small> 1
          'url_site' => <small>int</small> 1
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'icone_objet' => <small>string</small> 'forum' *(length=5)*
      'texte_modifier' => <small>string</small> 'forum:icone_modifier_forum' *(length=26)*
      'champs_versionnes' => 
        **array**
          *empty*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_mots' => 
    **array**
      'type' => <small>string</small> 'mot' *(length=3)*
      'type_surnoms' => 
        **array**
          0 => <small>string</small> 'mot-cle' *(length=7)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'public:mots_clefs' *(length=17)*
      'texte_objet' => <small>string</small> 'public:mots_clef' *(length=16)*
      'texte_modifier' => <small>string</small> 'icone_modifier_mot' *(length=18)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_mot' *(length=14)*
      'info_1_objet' => <small>string</small> 'info_1_mot' *(length=10)*
      'info_nb_objets' => <small>string</small> 'info_nb_mots' *(length=12)*
      'titre' => <small>string</small> 'titre, '' AS lang' *(length=17)*
      'date' => <small>string</small> 'date' *(length=4)*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'field' => 
        **array**
          'id_mot' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'descriptif' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'texte' => <small>string</small> 'longtext DEFAULT '' NOT NULL' *(length=28)*
          'id_groupe' => <small>string</small> 'bigint(21) DEFAULT 0 NOT NULL' *(length=29)*
          'type' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_mot' *(length=6)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 8
          'texte' => <small>int</small> 1
          'descriptif' => <small>int</small> 5
      'rechercher_jointures' => 
        **array**
          'article' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'breve' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'rubrique' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'document' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'titre' *(length=5)*
          1 => <small>string</small> 'descriptif' *(length=10)*
          2 => <small>string</small> 'texte' *(length=5)*
          3 => <small>string</small> 'id_groupe' *(length=9)*
      'table_objet' => <small>string</small> 'mots' *(length=4)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> 'mot' *(length=3)*
      'url_voir' => <small>string</small> 'mot' *(length=3)*
      'url_edit' => <small>string</small> 'mot_edit' *(length=8)*
      'icone_objet' => <small>string</small> 'mot' *(length=3)*
  'spip_groupes_mots' => 
    **array**
      'table_objet_surnoms' => 
        **array**
          0 => <small>string</small> 'groupe_mots' *(length=11)*
          1 => <small>string</small> 'groupe_mot' *(length=10)*
          2 => <small>string</small> 'groupe' *(length=6)*
      'type' => <small>string</small> 'groupe_mots' *(length=11)*
      'type_surnoms' => 
        **array**
          0 => <small>string</small> 'groupes_mot' *(length=11)*
          1 => <small>string</small> 'groupemot' *(length=9)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'mots:titre_groupes_mots' *(length=23)*
      'texte_objet' => <small>string</small> 'mots:titre_groupe_mots' *(length=22)*
      'texte_modifier' => <small>string</small> 'icone_modif_groupe_mots' *(length=23)*
      'info_aucun_objet' => <small>string</small> 'mots:info_aucun_groupemots' *(length=26)*
      'info_1_objet' => <small>string</small> 'mots:info_1_groupemots' *(length=22)*
      'info_nb_objets' => <small>string</small> 'mots:info_nb_groupemots' *(length=23)*
      'titre' => <small>string</small> 'titre, '' AS lang' *(length=17)*
      'date' => <small>string</small> 'date' *(length=4)*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'field' => 
        **array**
          'id_groupe' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'descriptif' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'texte' => <small>string</small> 'longtext DEFAULT '' NOT NULL' *(length=28)*
          'unseul' => <small>string</small> 'varchar(3) DEFAULT '' NOT NULL' *(length=30)*
          'obligatoire' => <small>string</small> 'varchar(3) DEFAULT '' NOT NULL' *(length=30)*
          'tables_liees' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'minirezo' => <small>string</small> 'varchar(3) DEFAULT '' NOT NULL' *(length=30)*
          'comite' => <small>string</small> 'varchar(3) DEFAULT '' NOT NULL' *(length=30)*
          'forum' => <small>string</small> 'varchar(3) DEFAULT '' NOT NULL' *(length=30)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_groupe' *(length=9)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 8
          'texte' => <small>int</small> 1
          'descriptif' => <small>int</small> 5
      'rechercher_jointures' => 
        **array**
          'article' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'breve' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'rubrique' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
          'document' => 
            **array**
              'mot' => 
                **array**
                  'titre' => <small>int</small> 3
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'titre' *(length=5)*
          1 => <small>string</small> 'descriptif' *(length=10)*
          2 => <small>string</small> 'texte' *(length=5)*
          3 => <small>string</small> 'un_seul' *(length=7)*
          4 => <small>string</small> 'obligatoire' *(length=11)*
          5 => <small>string</small> 'tables_liees' *(length=12)*
          6 => <small>string</small> 'minirezo' *(length=8)*
          7 => <small>string</small> 'forum' *(length=5)*
          8 => <small>string</small> 'comite' *(length=6)*
      'table_objet' => <small>string</small> 'groupes_mots' *(length=12)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> 'groupe_mots' *(length=11)*
      'url_voir' => <small>string</small> 'groupe_mots' *(length=11)*
      'url_edit' => <small>string</small> 'groupe_mots_edit' *(length=16)*
      'icone_objet' => <small>string</small> 'groupe_mots' *(length=11)*
  'spip_petitions' => 
    **array**
      'url_voir' => <small>string</small> 'controler_petition' *(length=18)*
      'url_edit' => <small>string</small> 'controler_petition' *(length=18)*
      'editable' => <small>boolean</small> false
      'principale' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> '' *(length=0)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'titre' => <small>string</small> 'texte as titre, '' AS lang' *(length=26)*
      'field' => 
        **array**
          'id_article' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'email_unique' => <small>string</small> 'CHAR (3) DEFAULT '' NOT NULL' *(length=28)*
          'site_obli' => <small>string</small> 'CHAR (3) DEFAULT '' NOT NULL' *(length=28)*
          'site_unique' => <small>string</small> 'CHAR (3) DEFAULT '' NOT NULL' *(length=28)*
          'message' => <small>string</small> 'CHAR (3) DEFAULT '' NOT NULL' *(length=28)*
          'texte' => <small>string</small> 'LONGTEXT DEFAULT '' NOT NULL' *(length=28)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_article' *(length=10)*
      'type' => <small>string</small> 'petition' *(length=8)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'petitions' *(length=9)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'icone_objet' => <small>string</small> 'petition' *(length=8)*
      'texte_modifier' => <small>string</small> 'petition:icone_modifier_petition' *(length=32)*
      'texte_objets' => <small>string</small> 'petition:titre_petitions' *(length=24)*
      'texte_objet' => <small>string</small> 'petition:titre_petition' *(length=23)*
      'info_aucun_objet' => <small>string</small> 'petition:info_aucun_petition' *(length=28)*
      'info_1_objet' => <small>string</small> 'petition:info_1_petition' *(length=24)*
      'info_nb_objets' => <small>string</small> 'petition:info_nb_petitions' *(length=26)*
      'date' => <small>string</small> '' *(length=0)*
      'champs_versionnes' => 
        **array**
          *empty*
      'rechercher_champs' => 
        **array**
          *empty*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_signatures' => 
    **array**
      'url_voir' => <small>string</small> 'controler_petition' *(length=18)*
      'url_edit' => <small>string</small> 'controler_petition' *(length=18)*
      'editable' => <small>boolean</small> false
      'principale' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> '' *(length=0)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'signatures_petition' *(length=19)*
      'texte_objet' => <small>string</small> 'entree_signature' *(length=16)*
      'info_aucun_objet' => <small>string</small> 'petitions:aucune_signature' *(length=26)*
      'info_1_objet' => <small>string</small> 'petitions:une_signature' *(length=23)*
      'info_nb_objets' => <small>string</small> 'petitions:nombre_signatures' *(length=27)*
      'titre' => <small>string</small> 'nom_email as titre, '' AS lang' *(length=30)*
      'date' => <small>string</small> 'date_time' *(length=9)*
      'field' => 
        **array**
          'id_signature' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'id_article' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'date_time' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'nom_email' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'ad_email' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'nom_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'url_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'message' => <small>string</small> 'mediumtext DEFAULT '' NOT NULL' *(length=30)*
          'statut' => <small>string</small> 'varchar(10) DEFAULT '0' NOT NULL' *(length=32)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_signature' *(length=12)*
          'KEY id_article' => <small>string</small> 'id_article' *(length=10)*
          'KEY statut' => <small>string</small> 'statut' *(length=6)*
      'join' => 
        **array**
          'id_signature' => <small>string</small> 'id_signature' *(length=12)*
          'id_article' => <small>string</small> 'id_article' *(length=10)*
      'type' => <small>string</small> 'signature' *(length=9)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'signatures' *(length=10)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'icone_objet' => <small>string</small> 'signature' *(length=9)*
      'texte_modifier' => <small>string</small> 'signature:icone_modifier_signature' *(length=34)*
      'champs_versionnes' => 
        **array**
          *empty*
      'rechercher_champs' => 
        **array**
          *empty*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_syndic' => 
    **array**
      'table_objet_surnoms' => 
        **array**
          0 => <small>string</small> 'site' *(length=4)*
      'type' => <small>string</small> 'site' *(length=4)*
      'type_surnoms' => 
        **array**
          0 => <small>string</small> 'syndic' *(length=6)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'icone_sites_references' *(length=22)*
      'texte_objet' => <small>string</small> 'sites:icone_site_reference' *(length=26)*
      'texte_modifier' => <small>string</small> 'icone_modifier_site' *(length=19)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_site' *(length=15)*
      'info_1_objet' => <small>string</small> 'info_1_site' *(length=11)*
      'info_nb_objets' => <small>string</small> 'info_nb_sites' *(length=13)*
      'titre' => <small>string</small> 'nom_site AS titre, '' AS lang' *(length=29)*
      'date' => <small>string</small> 'date' *(length=4)*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'field' => 
        **array**
          'id_syndic' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'id_rubrique' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'id_secteur' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'nom_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'url_site' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'url_syndic' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'descriptif' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
          'syndication' => <small>string</small> 'VARCHAR(3) DEFAULT '' NOT NULL' *(length=30)*
          'statut' => <small>string</small> 'varchar(10) DEFAULT '0' NOT NULL' *(length=32)*
          'date' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'date_syndic' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'date_index' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'moderation' => <small>string</small> 'VARCHAR(3) DEFAULT 'non'' *(length=24)*
          'miroir' => <small>string</small> 'VARCHAR(3) DEFAULT 'non'' *(length=24)*
          'oubli' => <small>string</small> 'VARCHAR(3) DEFAULT 'non'' *(length=24)*
          'resume' => <small>string</small> 'VARCHAR(3) DEFAULT 'oui'' *(length=24)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_syndic' *(length=9)*
          'KEY id_rubrique' => <small>string</small> 'id_rubrique' *(length=11)*
          'KEY id_secteur' => <small>string</small> 'id_secteur' *(length=10)*
          'KEY statut' => <small>string</small> 'statut, date_syndic' *(length=19)*
      'join' => 
        **array**
          'id_syndic' => <small>string</small> 'id_syndic' *(length=9)*
          'id_rubrique' => <small>string</small> 'id_rubrique' *(length=11)*
      'rechercher_champs' => 
        **array**
          'nom_site' => <small>int</small> 5
          'url_site' => <small>int</small> 1
          'descriptif' => <small>int</small> 3
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'id_rubrique' *(length=11)*
          1 => <small>string</small> 'id_secteur' *(length=10)*
          2 => <small>string</small> 'nom_site' *(length=8)*
          3 => <small>string</small> 'url_site' *(length=8)*
          4 => <small>string</small> 'url_syndic' *(length=10)*
          5 => <small>string</small> 'descriptif' *(length=10)*
      'table_objet' => <small>string</small> 'syndic' *(length=6)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> 'site' *(length=4)*
      'url_voir' => <small>string</small> 'site' *(length=4)*
      'url_edit' => <small>string</small> 'site_edit' *(length=9)*
      'icone_objet' => <small>string</small> 'site' *(length=4)*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_syndic_articles' => 
    **array**
      'table_objet_surnoms' => 
        **array**
          0 => <small>string</small> 'syndic_article' *(length=14)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'sites:icone_articles_syndic' *(length=27)*
      'texte_objet' => <small>string</small> 'sites:icone_article_syndic' *(length=26)*
      'texte_modifier' => <small>string</small> 'icone_modifier_article' *(length=22)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_article_syndique' *(length=27)*
      'info_1_objet' => <small>string</small> 'info_1_article_syndique' *(length=23)*
      'info_nb_objets' => <small>string</small> 'info_nb_articles_syndiques' *(length=26)*
      'url_voir' => <small>string</small> '' *(length=0)*
      'url_edit' => <small>string</small> '' *(length=0)*
      'page' => <small>string</small> '' *(length=0)*
      'date' => <small>string</small> 'date' *(length=4)*
      'editable' => <small>boolean</small> false
      'principale' => <small>string</small> 'oui' *(length=3)*
      'field' => 
        **array**
          'id_syndic_article' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'id_syndic' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'url' => <small>string</small> 'VARCHAR(255) DEFAULT '' NOT NULL' *(length=32)*
          'date' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'lesauteurs' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
          'statut' => <small>string</small> 'varchar(10) DEFAULT '0' NOT NULL' *(length=32)*
          'descriptif' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'lang' => <small>string</small> 'VARCHAR(10) DEFAULT '' NOT NULL' *(length=31)*
          'url_source' => <small>string</small> 'TINYTEXT DEFAULT '' NOT NULL' *(length=28)*
          'source' => <small>string</small> 'TINYTEXT DEFAULT '' NOT NULL' *(length=28)*
          'tags' => <small>string</small> 'TEXT DEFAULT '' NOT NULL' *(length=24)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_syndic_article' *(length=17)*
          'KEY id_syndic' => <small>string</small> 'id_syndic' *(length=9)*
          'KEY statut' => <small>string</small> 'statut' *(length=6)*
          'KEY url' => <small>string</small> 'url' *(length=3)*
      'join' => 
        **array**
          'id_syndic_article' => <small>string</small> 'id_syndic_article' *(length=17)*
          'id_syndic' => <small>string</small> 'id_syndic' *(length=9)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 5
          'descriptif' => <small>int</small> 1
      'type' => <small>string</small> 'syndic_article' *(length=14)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'syndic_articles' *(length=15)*
      'icone_objet' => <small>string</small> 'syndic_article' *(length=14)*
      'titre' => <small>string</small> '' *(length=0)*
      'champs_versionnes' => 
        **array**
          *empty*
      'rechercher_jointures' => 
        **array**
          *empty*
  'spip_breves' => 
    **array**
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'public:breves' *(length=13)*
      'texte_objet' => <small>string</small> 'public:breve' *(length=12)*
      'texte_modifier' => <small>string</small> 'icone_modifier_breve' *(length=20)*
      'info_aucun_objet' => <small>string</small> 'info_aucun_breve' *(length=16)*
      'info_1_objet' => <small>string</small> 'info_1_breve' *(length=12)*
      'info_nb_objets' => <small>string</small> 'info_nb_breves' *(length=14)*
      'titre' => <small>string</small> 'titre, lang' *(length=11)*
      'date' => <small>string</small> 'date_heure' *(length=10)*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'field' => 
        **array**
          'id_breve' => <small>string</small> 'bigint(21) NOT NULL' *(length=19)*
          'date_heure' => <small>string</small> 'datetime DEFAULT '0000-00-00 00:00:00' NOT NULL' *(length=47)*
          'titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'texte' => <small>string</small> 'longtext DEFAULT '' NOT NULL' *(length=28)*
          'lien_titre' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'lien_url' => <small>string</small> 'text DEFAULT '' NOT NULL' *(length=24)*
          'statut' => <small>string</small> 'varchar(6)  DEFAULT '0' NOT NULL' *(length=32)*
          'id_rubrique' => <small>string</small> 'bigint(21) DEFAULT '0' NOT NULL' *(length=31)*
          'lang' => <small>string</small> 'VARCHAR(10) DEFAULT '' NOT NULL' *(length=31)*
          'langue_choisie' => <small>string</small> 'VARCHAR(3) DEFAULT 'non'' *(length=24)*
          'maj' => <small>string</small> 'TIMESTAMP' *(length=9)*
      'key' => 
        **array**
          'PRIMARY KEY' => <small>string</small> 'id_breve' *(length=8)*
          'KEY id_rubrique' => <small>string</small> 'id_rubrique' *(length=11)*
      'join' => 
        **array**
          'id_breve' => <small>string</small> 'id_breve' *(length=8)*
          'id_rubrique' => <small>string</small> 'id_rubrique' *(length=11)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 8
          'texte' => <small>int</small> 2
          'lien_titre' => <small>int</small> 1
          'lien_url' => <small>int</small> 1
      'rechercher_jointures' => 
        **array**
          'document' => 
            **array**
              'titre' => <small>int</small> 2
              'descriptif' => <small>int</small> 1
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'id_rubrique' *(length=11)*
          1 => <small>string</small> 'titre' *(length=5)*
          2 => <small>string</small> 'lien_titre' *(length=10)*
          3 => <small>string</small> 'lien_url' *(length=8)*
          4 => <small>string</small> 'texte' *(length=5)*
      'type' => <small>string</small> 'breve' *(length=5)*
      'type_surnoms' => 
        **array**
          *empty*
      'table_objet' => <small>string</small> 'breves' *(length=6)*
      'table_objet_surnoms' => 
        **array**
          *empty*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'page' => <small>string</small> 'breve' *(length=5)*
      'url_voir' => <small>string</small> 'breve' *(length=5)*
      'url_edit' => <small>string</small> 'breve_edit' *(length=10)*
      'icone_objet' => <small>string</small> 'breve' *(length=5)*
  'spip_documents' => 
    **array**
      'table_objet_surnoms' => 
        **array**
          0 => <small>string</small> 'doc' *(length=3)*
          1 => <small>string</small> 'img' *(length=3)*
          2 => <small>string</small> 'emb' *(length=3)*
      'type_surnoms' => 
        **array**
          *empty*
      'url_voir' => <small>string</small> 'document_edit' *(length=13)*
      'url_edit' => <small>string</small> 'document_edit' *(length=13)*
      'page' => <small>string</small> '' *(length=0)*
      'texte_retour' => <small>string</small> 'icone_retour' *(length=12)*
      'texte_objets' => <small>string</small> 'medias:objet_documents' *(length=22)*
      'texte_objet' => <small>string</small> 'medias:objet_document' *(length=21)*
      'texte_modifier' => <small>string</small> 'medias:info_modifier_document' *(length=29)*
      'info_aucun_objet' => <small>string</small> 'medias:aucun_document' *(length=21)*
      'info_1_objet' => <small>string</small> 'medias:un_document' *(length=18)*
      'info_nb_objets' => <small>string</small> 'medias:des_documents' *(length=20)*
      'titre' => <small>string</small> 'titre, fichier AS surnom, '' AS lang' *(length=36)*
      'date' => <small>string</small> 'date' *(length=4)*
      'rechercher_champs' => 
        **array**
          'titre' => <small>int</small> 3
          'descriptif' => <small>int</small> 1
          'fichier' => <small>int</small> 1
      'champs_versionnes' => 
        **array**
          0 => <small>string</small> 'id_vignette' *(length=11)*
          1 => <small>string</small> 'titre' *(length=5)*
          2 => <small>string</small> 'descriptif' *(length=10)*
          3 => <small>string</small> 'hauteur' *(length=7)*
          4 => <small>string</small> 'largeur' *(length=7)*
          5 => <small>string</small> 'mode' *(length=4)*
          6 => <small>string</small> 'distant' *(length=7)*
      'type' => <small>string</small> 'document' *(length=8)*
      'table_objet' => <small>string</small> 'documents' *(length=9)*
      'principale' => <small>string</small> 'oui' *(length=3)*
      'editable' => <small>string</small> 'oui' *(length=3)*
      'icone_objet' => <small>string</small> 'document' *(length=8)*
      'rechercher_jointures' => 
        **array**
          *empty*

Il y a juste UN truc que je n'arrive pas bien à visualiser pour l'instant pour deux raisons : 1) parce que les déclarations sont déportées dans des plugins et 2) parce qu'avec ce pipeline on est dans une déclaration pour un objet précis et plus un truc global.

Ce que je ne comprends pas donc, c'est comment ça se passe pour les déclarations de jointures ainsi que pour les déclarations de rechercher_jointures.

Dans les deux cas, où doivent se mettre les trucs et comment faire en sorte pour que ce soit automatique pour de nouveaux objets ?
Si on le met dans un objet de base (article) on ne peut pas prévoir les objets qui seront liés (mots, notations, geo...) et inversement...

Là actuellement je vois un mélange des deux. Dans la table article, on déclare un rechercher_jointures sur les documents par exemple (et les mots alors !?). Et dans la table forum on déclare un join avec id_article, id_breve, etc.

Alors comment ça doit vraiment se passer ?

* cedric.morin@yterium.com tapuscrivait, le 18/02/2011 11:31:

Hello,

Salut,

Le pipeline declarer_tables_objets_sql
permet de declarer les objets editoriaux et leur table SQL.
Il voit passer un tableau associatif dont la clé est le nom SQL de la table (ex : spip_articles)

Je me suis réveillé avec une question suite à ce nouveau formalisme de déclaration des tables de SPIP :
qu'est-ce qui manquerait pour générer dynamiquement les pages de consultation/édition de ces objets ?
Est-ce que l'essentiel n'est pas déjà dans Extra2 ? (ou dans Drupal/Typo3)

PS : en tout cas, bravo pour tout ça !

-- RealET

Je me suis réveillé avec une question suite à ce nouveau formalisme de
déclaration des tables de SPIP :
qu'est-ce qui manquerait pour générer dynamiquement les pages de
consultation/édition de ces objets ?

Toi ! :slight_smile: Vas-y donc !

Est-ce que l'essentiel n'est pas déjà dans Extra2 ? (ou dans Drupal/Typo3)

Blague à part, ce qui manque c'est la déclaration des *saisies* à utiliser pour générer un vrai formulaire d'édition avec label, explication, messages d'erreurs etc.

C'est ce qui se trouve dans Drupal par exemple. Sans parler de création d'objets à la souris, et bien quand on déclare en PHP une table pour un objet, on utilise *aussi* l'API "Drupal Forms" dans la même déclaration.

L'API de Saisies pourrait donc être utilisé en ajoutant un paramètre :
'sql' => 'text not null default ""'

Juste en ajoutant cette ligne ça fait déjà SQL + interface HTML.

Et même mieux : en fait pour chaque type de saisies dans Drupal il y a un type SQL *par défaut* (textarea => text / oui_non => tinyint(1)), ce qui fait qu'en déclarant uniquement des saisies, si le type SQL convient déjà, on a même pas à le déclarer.

À réfléchir ?

On va y arriver, mais je vois plutot ça comme fonctionnalité pour la release suivante, pour éviter de s'embarquer dans une course sans fin à la "super fonctionnalité en plus" qui fait qu'on arrivera jamais à sortir une version : on a déjà plein de trucs à finir et consolider pour cette version, donc il ne faut pas se disperser.
Mais c'est clairement l'objectif sous jacent.

Il est apparait aussi assez clairement si tu compare les squelettes des pages de consultation/edition des objets du core et des extensions :
à part quelques petits détails liés aux chaines de langue, par exemple, on arrive à quelque chose de très standardisé,
donc de plus en plus vraisemblablement facile à générer automatiquement pour de nouveaux objets.

Cédric

Le plugin spip_objets dont le début est sur la zone permet déjà de faire en grande partie tout cela ... mais il faut le finaliser.

Ceci dit, ce sera effectivement la killer fonctionnalité :slight_smile:

Par rapport au sujet initial, avec rechercher_liste_des_jointures qui est déclaré dans mots_declarer_tables_objets_sql à présent :
Je ne comprends pas qu’est-ce qui marche pas (plus ? faudrait que je tente en revenant à une version avant l’introduction).

La recherche sur le titre d’un mot clé qui est rattaché à un article (et donc le mot clé n’est pas dans les champs de l’article bien sûr) devrait pourtant se faire ?

Mots a bien :
Le plugin.xml ok :

declarer_tables_objets_sql base/mots.php

et dans base/mots.php :
function mots_declarer_tables_objets_sql($tables){

‘rechercher_jointures’ => array(
‘article’ => array(
‘mot’ => array(‘titre’ => 3),
),
‘breve’ => array(
‘mot’ => array(‘titre’ => 3),
),
‘rubrique’ => array(
‘mot’ => array(‘titre’ => 3),
),
‘document’ => array(
‘mot’ => array(‘titre’ => 3)
)
),


}

Alors pourquoi la recherche sur le titre d’un mot ne fait pas ressortir l’article lié dans le privé comme dans le public ? Y a pas un array en trop pour que ce soit traiter par “rechercher_jointures” ?
Dans breves, il y en a que 2 :

‘rechercher_jointures’ => array(
‘document’ => array(‘titre’ => 2, ‘descriptif’ => 1)
),

2011/2/21 Guy Cesaro <guy.cesaro@gmail.com>

Par rapport au sujet initial, avec rechercher_liste_des_jointures qui est déclaré dans mots_declarer_tables_objets_sql à présent :
Je ne comprends pas qu’est-ce qui marche pas (plus ? faudrait que je tente en revenant à une version avant l’introduction).

Whaou ! Merci Cédric, c’est tout réparé !