Tại sao hook_update_N không chạy?


7

Tôi đang chuyển một mô-đun sang Drupal 7. Mô-đun này có các hook_update_N()chức năng được gọi từ hook_install(). Có một số truy vấn chèn được thực hiện bên trong một trong các hook_update_N()hàm. Nhưng hook_update_Nchức năng của tôi không chạy. Có cách nào để gọi hook_update_Nhàm rõ ràng không?

Tôi biết câu hỏi của tôi gần giống như thế này Làm thế nào để có hook_install () để chạy tất cả hook_update_N ()? . Nhưng tôi không hiểu làm thế nào hook_update_N()được gọi. Tôi đã chạy các bản cập nhật trong trang web Drupal của mình mà tôi nghĩ cũng chạy các bản cập nhật của các mô-đun tùy chỉnh nhưng có vẻ như nó hook_update_N()không được kích hoạt. Bởi vì, tôi đã thêm error_log()chức năng bên trong hook_update_N()nhưng tệp nhật ký trống.

Câu trả lời:


6

Các cửa hàng Drupal cập nhật hook đã được chạy vì nó chỉ chạy các hook cập nhật một lần. Nếu một móc cập nhật cụ thể không chạy, lý do có thể xảy ra nhất là

  • Nó đã được chạy
  • Một hook cập nhật cần phải được chạy trước khi thất bại.

Bạn có thể thấy trong bảng hệ thống tất cả các mô-đun được kích hoạt và các schema_versionchương trình cập nhật nào đã được chạy lần trước.


cảm ơn bạn!! gợi ý của bạn "nhìn thấy trong bảng hệ thống" đã giúp tôi rất nhiều!
subhojit777

Bạn có biết lý do nào khác không? -1 là trường hợp đặc biệt? Bạn có biết ý nghĩa của nó?
htoip

10

Một lý do khác tại sao hook cập nhật sẽ không chạy là sự không khớp giữa tên hook cập nhật và số phát hành chính của mô-đun (xem tệp .info).

Ví dụ: hook update mymodule_update_7001 không chạy nếu phiên bản mô-đun là 7.x.1.0. Trong trường hợp như vậy, bạn phải đổi tên hook thành mymodule_update_7101.

Xem tài liệu API hook_update


1
Điều này chỉ giúp tôi tiết kiệm được số giờ gỡ lỗi không xác định! Cảm ơn!
Pryo

1
Đối với tôi, đó cũng là lỗi sai 1.x với 7100, thanx
Marko Blazekovic

2

Tôi gặp sự cố khi cài đặt một mô-đun mới, nhưng cài đặt không thành công. Lược đồ_version vẫn ở mức -1, điều này ngăn cản cập nhật thêm cho mô-đun đó. Đặt phiên bản về 0 đã sửa nó.

Để tò mò, tôi đã chuyển lược đồ của một bảng hiện có sang một mô-đun mới. Thất bại xảy ra khi nó không thể tạo bảng hiện có, mà tôi mong đợi. Mô-đun được kích hoạt như mong đợi, nhưng tôi không nhận ra rằng lược đồ_version không cập nhật.


1
Tôi gặp vấn đề tương tự khi giản đồ giản lược của mô-đun tùy chỉnh được kích hoạt và hoạt động được đặt thành -1. AFAIK nó chỉ được cài đặt một lần và không cài đặt được vì ngày nay mô-đun đang được sử dụng. Tôi không biết tại sao lược đồ_version được đặt thành -1. Dù sao, tôi đã cập nhật thủ công lược đồ_version thành 0 để nó nhận ra và chạy custom_update_7000 của tôi khi tôi cần thêm một cột vào một bảng hiện có đã được cài đặt với mô-đun từ lâu.
Wesley Musgrove

1

Một lý do hàm hook_update_N () sẽ không làm gì cả là một bản cập nhật có cùng số hoặc cao hơn (so với số bạn đã sử dụng trên hàm hook_update_N ()) đã chạy.

Bạn có thể thấy số cập nhật cuối cùng chạy cho mô-đun của mình bằng cách truy vấn bảng 'hệ thống' trên Drupal 7. 'giản đồ_version' là một cột trên bảng 'hệ thống' lưu trữ số phiên bản của bản cập nhật cuối cùng được áp dụng cho mô-đun của bạn. Để hàm hook_update_N () mới của bạn hoạt động, số (N) bạn sử dụng trên nó phải cao hơn số hiện được lưu trữ trong cột 'giản đồ_version' cho mô-đun đó.

Tôi đã sử dụng truy vấn sau trong dòng lệnh MySql (sau lần đầu tiên ban hành lệnh 'use' để chỉ định tên cơ sở dữ liệu Drupal 7 của tôi).

mysql chọn tên, loại, trạng thái, giản đồ_version từ hệ thống trong đó type = 'module' và name = 'my_module_name';

Cột 'giản đồ_version' sẽ có một số. Số bạn sử dụng trên chức năng cập nhật mới của bạn phải cao hơn số đó.


1

Tôi chỉ gặp vấn đề này và nghĩ rằng tôi đã thêm vào đống vì tôi không thể thấy nó được đề cập trong các câu trả lời khác.

Vấn đề của tôi là với Drupal 8.7 và vấn đề là tên mô-đun có các ký tự in hoa khiến nó không thể kiểm tra cập nhật. Ví dụ : myModule.

Lý do là drupal_get_schema_versions()có một mảng tĩnh trong $updatesđó là một mảng kết hợp của các phiên bản lược đồ cập nhật có sẵn được khóa bởi tên mô-đun. Nhưng tên mô-đun là tất cả trong chữ thường. Ví dụ $updates['mymodule']. Điều này khiến logic không thành công và không trả lại bất cứ điều gì, khiến Drupal nghĩ rằng không có bản cập nhật.

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.