Tính năng xử lý sự cố với xóa một trường


14

Giả sử tôi có một loại nội dung Personvới các lĩnh vực: Name, Age,Email

Loại nội dung này được điều khiển bởi một Tính năng được gọi testđể tôi có thể kiểm soát nguồn và đẩy nó đến trang web trực tiếp.

Quy trình làm việc của tôi diễn ra như sau:

  • Tôi thêm một trường mới vào Personđược gọiPhone
  • tại địa phương tôi làm: drush fu test -y
  • Tôi chỉnh sửa test.infođể tăng số phiên bản
  • Tôi cam kết thay đổi kho lưu trữ của tôi
  • Tôi đẩy tính năng này lên trang web trực tiếp (sao chép các tệp tính năng)
  • trên trang web trực tiếp tôi làm: drush fr test -y
  • trên trang web trực tiếp tôi làm: drush cc all

Sau đó, trường mới xuất hiện trên trang web trực tiếp Person.

Nếu ở bước đầu tiên, tôi xóa một trường của Persontrường sẽ không bị xóa khỏi trang web trực tiếp. Tôi giải quyết điều này như thế nào? Tôi không muốn phải xóa thủ công khỏi UI trên trang web trực tiếp.
Quy trình làm việc này có đúng không?


1
Sử dụng drush fu test -y --version-gia tăng để tự động tăng số phiên bản
Mike

Câu trả lời:


9

Đây là một con dao hai lưỡi, nó như thế này để ngăn chặn việc xóa dữ liệu luôn là một điều tốt. Không có gì thực sự để giải quyết, đây là hành vi dự kiến.

Đó là quy trình công việc tương tự mà chúng tôi sử dụng và đã thực hiện được hơn một năm và nó hoạt động rất tốt. Tôi nói nó đúng nhưng đó là một câu trả lời rất chủ quan.


Và nếu tôi thực sự muốn xóa các lĩnh vực? Tôi có nên xem xét móc cập nhật? (Tôi là người mới chơi D7).
cherouvim

3
Cập nhật móc sẽ là lý tưởng, hoặc loại bỏ nó bằng tay.
kỹ thuật số

2
OK, tôi cũng có thể làmdrush field-delete field
cherouvim

@cherouvim Vì vậy, bạn phải làm điều đó mỗi khi bạn tạo lại một tính năng?
AlxVallejo

Một hook_update_N () trong tệp .install của tính năng sẽ hoạt động.
Mike

10

Cách chính xác để xóa nội dung do Tính năng tạo là thông qua hook_update_N (cần được triển khai trong tệp your_module.install).


Ý tưởng chính với Tính năng là quản lý cấu hình bằng mã. Việc sử dụng hook_update_Nphù hợp với điều đó, vì việc xóa trường nằm trong mã (có thể được quản lý bằng kiểm soát phiên bản) - trong khi lệnh tương đương drush field-delete fieldkhông được gọi từ mã được quản lý; đó là một bước dòng lệnh riêng biệt mà bạn cần thực hiện (và phải nhớ thực hiện).


Tại sao? Sẽ không drush field-delete fieldhoạt động tốt?
cherouvim

5
Chắc chắn, điều đó sẽ làm việc, và có thể là một giải pháp đơn giản hơn. Nhưng ý tưởng chính với Tính năng là quản lý cấu hình bằng mã. Việc sử dụng hook_update()phù hợp với điều đó, vì việc xóa trường nằm trong mã (có thể được quản lý bằng kiểm soát phiên bản) - trong khi lệnh drush không được gọi từ mã được quản lý; đó là một bước dòng lệnh riêng biệt mà bạn cần thực hiện (và phải nhớ thực hiện).
smokris

Tôi sẽ sử dụng hook_update () trong tập tin nào của một tính năng? hook_update () lấy một đối tượng nút làm tham số, do đó không thể cung cấp cho nó một đối tượng nút trong khi kích hoạt tính năng này.
subhojit777

@ subhojit777: Rất tiếc, tôi đã liên kết đến trang tài liệu hook sai. Tôi chỉ sửa lỗi liên kết; xin vui lòng xem các tài liệu cho hook_update_N.
khói

@smokris :) Tôi đã đề cập đến cái móc đó trong câu trả lời của tôi
subhojit777

2

Tạo một tệp mới gọi là "your_feature_name.install"

Trong tệp khai báo hook_update_N , ở đó bạn có thể sử dụng field_delete_field () và chỉ định tên của trường mà bạn muốn xóa làm tham số.

Chạy update.php và các trường sẽ bị xóa.


0

Nếu bạn đang sử dụng field_phoneở các khu vực khác, bạn có thể chỉ muốn xóa nó khỏi loại nội dung Người, nhưng không xóa hoàn toàn khỏi trang web của bạn. Tạo thủ công một YOUR_FEATURE_NAME.installtệp trong thư mục tính năng của bạn như vậy:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Nếu bạn đang xóa đoạn này khỏi Đoạn người thay vì Kiểu nội dung người, bạn có thể thay đổi câu điều kiện đầu tiên thành câu như sau:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
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.