2012-11-28 29 views
6

Tôi đang cố gắng tìm hiểu cách tạo loại nội dung tùy chỉnh theo chương trình từ trong mô-đun của mình.Làm cách nào để xóa dấu vết của Trường thuộc loại nội dung mô-đun?

Tuy nhiên, sau khi gỡ cài đặt và cài đặt lại mô-đun của mình, tôi đã gặp phải lỗi báo rằng một hoặc nhiều trường tôi đang cố gắng tạo không thể tạo được vì chúng đã tồn tại.

Vì vậy, tôi đã truy cập thông qua dữ liệu của mình, xóa loại nội dung và tất cả các bảng thuộc về nó.

Kết quả tương tự - trường đã tồn tại.

Tiếp theo, tôi đã đi đến trang web Drupal API tìm cách để xóa các lĩnh vực và các trường hợp lĩnh vực, và tình cờ gặp

field_delete_field() 

field_delete_instance() 

tôi đã thực hiện một trang php để cố gắng xóa các trường mà tôi đã tạo, chỉ để nhận được thông báo lỗi rằng bảng tôi đang cố xóa không tồn tại.

Vì vậy, tôi bị mắc kẹt - Tôi không thể tạo các trường vì chúng đã tồn tại và tôi không thể xóa chúng vì chúng không tồn tại!

BTW mã mà tôi đã mô hình hóa mô-đun của mình sau là mã được tìm thấy trong phần "node_example" của Drupal examples module.

Trả lời

4

Ouch, xóa các bảng cơ sở dữ liệu bằng tay không bao giờ là một ý tưởng tốt - Drupal không phải là tha thứ :)

Chỉ cần để giải quyết các mã trong của bạn cài đặt/kích hoạt móc, quấn tạo trường trong:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

Điều đó sẽ ngăn sự cố xảy ra lần nữa. Hoặc nếu bạn không muốn làm điều đó, hãy đảm bảo rằng trường này sẽ bị xóa trong móc gỡ cài đặt/vô hiệu hóa. Rõ ràng là phương pháp đó có thể dẫn đến mất dữ liệu.

Để giải quyết vấn đề hiện tại, theo quy trình này:

  • Hoàn toàn gỡ bỏ cài đặt (không chỉ vô hiệu hóa) mô-đun tùy chỉnh của bạn. Nếu nó ở trạng thái không nhất quán, chỉ cần xóa hàng của nó trong bảng system.
  • Xóa tất cả các dấu vết của trường khỏi các bảng field_configfield_config_instance.
  • Cắt bớt tất cả các bảng bộ nhớ cache theo cách thủ công (bất kỳ bảng nào bắt đầu bằng cache_).
  • Không thực sự cần thiết nhưng làm sáng tỏ bất kỳ nội dung kéo dài:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

Đó phải làm điều đó. Bất kỳ lúc nào bạn xóa một trường, thông qua giao diện người dùng hoặc theo chương trình bạn sẽ cần chạy cron hoặc gọi field_purge_batch() để 'khó' xóa các trường khi chúng chỉ được đánh dấu để xóa trong ví dụ đầu tiên.

+0

Cảm ơn rất nhiều! – Tyler

Các vấn đề liên quan