Cách tốt nhất để thả một trường từ một loại nội dung


21

Cách tốt nhất để xóa trường Drupal 7 khỏi loại nội dung được xác định qua GUI là gì? Tôi muốn sử dụng hook_update_N để những thay đổi có thể được lan truyền đến nhiều máy chủ khi chạy update.php. Tuy nhiên tôi dường như không thể tìm thấy một giải pháp. db_drop_table () sẽ có ý nghĩa với tôi đối với các lược đồ được xác định tùy chỉnh, nhưng không phải cho loại / trường nội dung được xác định thông qua GUI.


bạn đã tạo một mô-đun tùy chỉnh để xác định một loại nội dung?
iStryker

iStryker: đã tạo loại nội dung thông qua giao diện quản trị viên, thêm một số trường, sau đó xuất qua Tính năng. Nhưng bây giờ tôi muốn loại bỏ một trong những lĩnh vực đó theo chương trình.
barista nghiệp dư

Lưu ý rằng D5 cung cấp hàm content_field_instance_delete () , được ghi lại ở đâyđây , nhưng hàm đó không có sẵn cho D7. Ngoài ra, điều gây tò mò là field.install trong lõi D7 sử dụng để xóa các trường: _update_7000_field_delete_instance () - một chức năng "nội bộ" tùy chỉnh không có sẵn cho người khác sử dụng. Đối với một cái gì đó rất quan trọng như các lĩnh vực, đối với tôi, dường như cần có một chức năng "công khai" ở đâu đó và đó là những gì tôi đang tìm kiếm.
barista nghiệp dư

Hiện tại chức năng công khai "ứng cử viên" của tôi là field_delete_instance ().
barista nghiệp dư

Câu trả lời:


18

Có hai hàm api để xóa các trường:

  • field_delete_field Để xóa toàn bộ trường (tất cả các trường hợp của trường)
  • field_delete_instance Để chỉ xóa một thể hiện của một trường - đó là cách nó được gắn vào một thực thể.

Nếu bạn không muốn sử dụng lại trường, có thể xóa toàn bộ trường một chút thay vì chỉ xóa trường hợp của nó trên loại nội dung được đề cập. Chỉ có bạn mới có thể là người phán xét điều đó.


2
Làm việc như người ở. Hàm không trả về bất kỳ đối số nào, vì vậy khi sử dụng kết hợp với hook_update_N () tôi sẽ khuyên bạn nên thực hiện một watchdog () để ghi lại các thay đổi cập nhật của bạn.
barista nghiệp dư

9

Có, field_delete_instance () là hàm để xóa các trường hợp trường.

Lưu ý rằng field_delete_instance()tự động gọi field_delete_field()nếu không có phiên bản còn lại, vì vậy rất field_delete_instance()có thể là tất cả những gì bạn cần.

_update_7000_field_delete_instance()được thiết kế cho các chức năng cập nhật cốt lõi. Ví dụ: trong chức năng cập nhật x_update_7000(), bạn đang sử dụng field_delete_instance(). Sau đó x_update_7001(), bạn thay đổi {field_config}bảng theo cách không nhất quán và field_delete_instance()rõ ràng cũng cần phải thay đổi.

Nhưng bây giờ x_update_7000()cuộc gọi đến field_delete_instance()sẽ dẫn đến một lỗi vì bảng vẫn còn trong cấu trúc cũ. Tuy nhiên, tình huống cho các mô-đun đóng góp là khác nhau, vì chúng phải luôn được thực thi sau tất cả các cập nhật cốt lõi và do đó cần phải làm việc với phiên bản lõi gần đây nhất.

Nhưng, đây là mẫu mà bạn có thể muốn sử dụng cho các hàm API của riêng mình mà bạn đang sử dụng trong các hàm cập nhật.

Ngoài ra, các hàm _update này không thực hiện các hook vì kết quả không thể dự đoán được (ví dụ vì mô-đun mà bản cập nhật được chạy có thể bị vô hiệu hóa).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.