Comment reconstruire la table de registre?

9

J'ai tronqué la registrytable, à cause des autres problèmes, mais j'ai maintenant du mal à reconstruire la registrytable en fonction des fichiers répertoriés dans la base de données.

J'appelle registry_update(), _registry_update()ou registry_rebuild()pour le faire:

drush eval "registry_rebuild();"

Mais j'ai l'erreur suivante qui apparaît:

Erreur fatale: classe «SelectQueryExtender» introuvable dans includes / pager.inc sur la ligne 15

Par défaut (lors de l' systeminstallation du module), la registrytable est vide, alors comment Drupal remplit cette table avec les données par défaut appropriées?

Kenorb
la source

Réponses:

15

La façon la plus simple de le faire est d'activer n'importe quel module, car cela le fera pour vous. Bien sûr, si vous devez reconstruire le registre, l'interface utilisateur peut généralement ne pas être disponible, mais drush en [modulename]peut être tout ce dont vous avez besoin.

Si cela ne suffit pas, reconstruction du Registre rend facile trivialement de reconstruire le registre. La façon la plus simple de le faire est de l'installer comme une extension drush.

Installez l'extension et exécutez drush rr.

La page du module contient des instructions d'installation détaillées et montre également comment l'exécuter sans drush si nécessaire.

Létharion
la source
9

Cela peut être résolu soit en réinstallant Drupal, soit en copiant la table d'une nouvelle installation idéale de Drupal dans votre instance cassée.

Ou vous pouvez essayer la solution de contournement suivante (ne le faites que lorsque votre instance Drupal est déjà cassée):

  1. Sauvegardez d'abord l'ancienne table de registre (juste au cas où):

    drush sqlq "CREATE TABLE registry_bak LIKE registry; INSERT INTO registry_bak SELECT * FROM registry;"
    drush sqlq "CREATE TABLE system_bak LIKE system; INSERT INTO system_bak SELECT * FROM system;"
    
  2. Videz le cache d'amorçage et la table de registre.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Insérez les données de base dans la table de registre:

    drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("SelectQueryExtender", "class", "includes/database/select.inc"), ("DrupalDefaultEntityController", "class", "includes/entity.inc");'
    drush eval "registry_update();"
    
  4. Videz les caches:

    drush -y cc all
  5. Si la suppression des caches en 4. a échoué, en raison de certaines autres classes manquantes, vous pouvez:

    a) Ajoutez manuellement les classes manquantes, par exemple:

    $ drush -y cc all
    Fatal error: Class 'Entity' not found in profile2.module on line 593
    $ grep -Rwl "^class Entity" .
    ./sites/all/modules/entity/includes/entity.inc
    $ drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("Entity", "class", "sites/all/modules/entity/includes/entity.inc");'
    $ drush -y cc all # testing...
    # If Fatal error:, repeat 5a. again.
    

    ou:

    b) Essayez de désactiver ces modules contrib défaillants (par exemple profile2, règles) en:

    drush sqlq 'UPDATE system SET status = 0 WHERE name = "failing_module"'

    et répétez les étapes à partir de 4.

  6. Si quelque chose est plus cassé qu'il ne l'était, vous pouvez restaurer vos tables au point d'origine (ce qui a été fait en 1. étape) en:

    drush sqlq "TRUNCATE registry; INSERT INTO registry SELECT * FROM registry_bak;"
    drush sqlq "TRUNCATE system; INSERT INTO system SELECT * FROM system_bak;"
    

    et essayez à nouveau.

Voir aussi: Comment déplacer les modules installés de / sites / all / modules / * vers / sites / all / contrib / modules / *


La reconstruction de la registrytable peut également être réalisée par le script suivant exécuté dans Drupal webroot:

grep -ERo "^(\s+)?(abstract )?class (\S+)" . | tr ':' ' ' | sed "s/abstract //g" | awk '{print "INSERT INTO registry (filename, type, name) VALUES (\x27"$1"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' | $(drush sql-connect) -f

Merci à Mike pour son regex.

Kenorb
la source
4
thx - l'étape 3 m'a sauvé là où j'ai drush rréchoué
ErichBSchulz