จะสร้างตารางรีจิสตรีได้อย่างไร?


9

ฉันตัดทอนregistryตารางเนื่องจากปัญหาอื่น ๆ แต่ตอนนี้ฉันมีปัญหาในการสร้างregistryตารางใหม่ตามไฟล์ที่ระบุไว้ในฐานข้อมูล

ฉันโทรregistry_update(), _registry_update()หรือregistry_rebuild()ที่จะทำมัน

drush eval "registry_rebuild();"

แต่ฉันมีข้อผิดพลาดต่อไปนี้ซึ่งปรากฏขึ้น:

ข้อผิดพลาดร้ายแรง: ไม่พบคลาส 'SelectQueryExtender' ใน include / pager.inc ที่บรรทัด 15

โดยค่าเริ่มต้น (ในการsystemติดตั้งโมดูล) registryตารางว่างเปล่าดังนั้นวิธี Drupal กรอกตารางที่มีข้อมูลเริ่มต้นที่เหมาะสม?

คำตอบ:


15

วิธีที่ง่ายที่สุดที่จะทำคือเปิดใช้งานโมดูลใด ๆ ซึ่งจะทำเพื่อคุณ แน่นอนถ้าคุณต้องการสร้างรีจิสทรีใหม่โดยทั่วไปการพูด UI อาจใช้งานไม่ได้ แต่drush en [modulename]อาจเป็นสิ่งที่คุณต้องการ

หากยังไม่เพียงพอRegistry rebuildจะทำให้การสร้างรีจิสตรีทำได้ง่าย วิธีที่ง่ายที่สุดที่จะทำคือติดตั้งเป็นส่วนขยายที่ใช้งานง่าย

drush rrติดตั้งส่วนขยายและเรียกใช้

หน้าโมดูลมีคำแนะนำการติดตั้งโดยละเอียดและยังแสดงวิธีการเรียกใช้โดยไม่ต้องใช้เครื่องมือหากจำเป็น


9

สิ่งนี้สามารถแก้ไขได้โดยติดตั้ง Drupal ใหม่หรือคัดลอกตารางจากการติดตั้ง Drupal ที่สดใหม่ลงในอินสแตนซ์ที่ใช้งานไม่ได้ของคุณ

หรือคุณสามารถลองวิธีแก้ปัญหาต่อไปนี้ (ทำได้เฉพาะเมื่ออินสแตนซ์ Drupal ของคุณเสียแล้ว):

  1. สำรองข้อมูลตารางรีจิสทรีเก่าก่อน (ในกรณี):

    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. ล้างแคช bootstrap และตารางรีจิสตรี

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. แทรกข้อมูลพื้นฐานลงในตารางรีจิสทรี:

    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. ล้างแคช:

    drush -y cc all
  5. หากการล้างแคชใน 4 ล้มเหลวเนื่องจากคลาสที่หายไปบางคลาสคุณสามารถ:

    a) เพิ่มคลาสที่หายไปด้วยตนเองในตัวอย่าง:

    $ 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.

    หรือ:

    b) พยายามปิดการใช้งานโมดูล contrib ที่ล้มเหลว (เช่น profile2, กฎ) โดย:

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

    และทำซ้ำขั้นตอนที่เริ่มต้นจาก 4

  6. หากมีบางอย่างเสียหายมากกว่าเดิมคุณสามารถคืนค่าตารางของคุณกลับสู่จุดเดิม (ซึ่งดำเนินการในขั้นตอนที่ 1) โดย:

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

    และลองอีกครั้ง

ดูเพิ่มเติม: วิธีย้ายโมดูลที่ติดตั้งจาก / sites / all / modules / * ไปยัง / sites / all / contrib / modules / *


การสร้างregistryตารางขึ้นใหม่สามารถทำได้ด้วยสคริปต์ต่อไปนี้ที่ทำงานใน 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

ขอบคุณที่Mikeช่วย regex


4
ขอบคุณ - ขั้นตอนที่ 3 บันทึกฉันที่drush rrล้มเหลว
ErichBSchulz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.