hook_schema ne crée pas de table de base de données

12

La fonction suivante est contenue dans process_login.install dans le cadre d'un module personnalisé appelé process_login. Le module fonctionne si j'ai créé manuellement la table de base de données, mais naturellement je voudrais que la table soit créée automatiquement lors de l'installation.

La fonction elle-même ne génère pas d'erreur de schéma lors de l'installation du module. Mais il ne crée pas non plus la table de base de données process_login_register dans la base de données Drupal 7 MySQL.

Je ne vois aucune autre erreur ni aucun problème signalé par Site Report.

Je l'ai complètement supprimé et réinstallé plusieurs fois. J'ai beaucoup cherché sur le Web et consulté deux livres que j'ai sur le développement de Drupal. Je ne vois rien de mal avec cette fonction (répertoriée ci-dessous).

REMARQUE: j'ai également essayé de définir «id» comme série mais j'obtiens le même résultat (c'est-à-dire qu'aucune table n'a été créée).

Je n'ai plus d'idées. Est-ce que quelqu'un sait pourquoi cette fonction ne fonctionne pas?

function process_login_schema(){
  $schema['process_login_register'] = array(
        'description' => 'Register a specific computer with the system.',
        'fields' => array(
                'id' => array(
                    'description' => 'Primary identifier.',
                    'type' => 'int',
                    'unsigned' => TRUE,
                    'size' => 'normal',
                    'not null' => TRUE,
                    'default' => 0,
                ),
                'ip' => array(
                        'description' => "The user's IP address at registration.",
                        'type' => 'varchar',
                        'length' => 32,
                        'not null' => TRUE,
                        'default' => '',
                ),
                'user_agent' => array(
                        'description' => "The user's browser user agent string at registration.",
                        'type' => 'varchar',
                        'length' => 255,
                        'not null' => TRUE,
                        'default' => '',
                ),
        ),
        'primary key' => array('id'),
  );
  return $schema;
}
user8109
la source
Quelle version de Drupal utilisez-vous?
googletorp
3
Avez-vous réellement désinstallé et réinstallé (pas seulement désactivé et réactivé) le module depuis l'écriture de la fonction?
Clive
Drupal 6 nécessite d'appeler drupal_install_schema () dans hook_install. Dans Drupal 7, il est recommandé de ne pas l'appeler explicitement.
Shoaib Nawaz
Réponses ci-dessus: Drupal 7. Oui. J'utilise Drupal 7 donc je n'appelle pas drupal_install_schema ().
user8109
1
@ user8109 Activer / désactiver et installer / désinstaller sont deux choses complètement différentes dans les modules. Activer un module (le vérifier dans la page des modules et appuyer sur «Soumettre») n'activera qu'un module et l'invoquera hook_enable(). L'installation d'un module ne peut être effectuée qu'après avoir été désinstallé (en utilisant l'onglet de désinstallation ou développer / réinstaller), après quoi toutes les tables créées par le module sont supprimées. Lorsque vous installez ensuite le module, il hook_install()s'exécute comme prévu
Clive

Réponses:

22

Utilisez drush dre -y [module]ce qui désactive, désinstalle puis réactive le module. Le -ydrapeau le rend encore plus rapide, évitant d'avoir à appuyer sur y et à entrer trois fois.

bloke_zero
la source
16

Ce n'est que si vous désinstallez un module, puis le réinstallez, que les tables de base de données qu'il utilise et déclare avec hook_schema()sont recréées.

Pour désinstaller un module, vous devez:

  • Décochez la case affichée pour le module

    capture d'écran

  • Cliquez sur Enregistrer la configuration

    capture d'écran

  • Cliquez sur l'onglet: Uninstall_

  • Cliquez sur la case à cocher à gauche du nom du module
  • Cliquez sur le bouton Désinstaller

    capture d'écran

  • Sur la page suivante, confirmez que vous souhaitez désinstaller ce module en cliquant sur le bouton Désinstaller

    capture d'écran

Comme alternative, si vous avez installé Drush, vous pouvez utiliser les commandes suivantes.

drush pm-disable $module
drush pm-install $module
drush en $module

Remplacez $modulepar le nom court du module, entre les sommets et sans l'extension .module.

Ce que vous avez fait est de désactiver le module, puis de le réactiver. Même si vous avez supprimé le répertoire contenant le module, pour Drupal, ce que vous avez fait est simplement de le désactiver, puis de le réactiver.

kiamlaluno
la source
Est-il possible de le faire en utilisant drupal_install_schema et drupal_uninstall_schema .... drupal.org/node/876250
Hitesh