Làm cách nào để có hook_install () để chạy tất cả hook_update_N ()?


18

Làm cách nào tôi có thể lấy hook_install () để chạy tất cả các bản cập nhật mà tôi có cho mô-đun của mình? Tôi có trong đó tập tin mymod.install.

Tôi đã thử

function mymod_install() {
  mymod_update_6001();
}

nhưng nó dường như không làm gì cả Nếu tôi có mymod_update_6002 () tôi vẫn sẽ gọi 6001 (), chỉ cần gọi 6002 () hoặc gọi cả hai theo thứ tự 6001 (), 6002 ().

Tôi nghĩ rằng sẽ là lẽ thường khi chạy tất cả các bản cập nhật khi bạn cài đặt một mô-đun theo mặc định.

Câu trả lời:


19

Bạn không nên lấy hook cài đặt để chạy cập nhật. Khi một mô-đun được cài đặt lần đầu tiên, không cần cập nhật.

Cập nhật được sử dụng khi mô-đun đã được cài đặt (cơ sở dữ liệu hoặc các biến đã được tạo). Trong trường hợp đó, bạn không muốn cài đặt lại mô-đun vì nó sẽ xóa sạch tất cả dữ liệu, thay vào đó bạn tạo các móc cập nhật_N. Drupal sẽ phát hiện những cập nhật nào là cần thiết và những cập nhật nào sẽ được chạy update.php. Trong Drupal 6, nó sẽ tự động chọn bản cập nhật nào sẽ thực hiện, nhưng bạn có thể thay đổi nó, trong khi điều này là không thể trong Drupal 7.

Drupal phát hiện những cập nhật nào là cần thiết bằng cách lưu số lần cập nhật cuối cùng. Đây có thể là những thay đổi trong cơ sở dữ liệu, cho phép chạy lại các bản cập nhật trong Drupal 7. Các bản cập nhật chạy lại thường là một ý tưởng tồi và thường sẽ gây ra lỗi và trong một số trường hợp có thể làm rối dữ liệu của bạn.

Luôn nhớ sao lưu cơ sở dữ liệu của bạn trước khi chạy cập nhật.


15

Mục đích của móc là khác nhau.

  • hook_install () được gọi khi mô-đun được cài đặt; nó có nghĩa là mô-đun chưa được cài đặt trước đó và do đó, nó không cần phải cập nhật.
  • hook_update_N () được gọi khi mô-đun đã được cài đặt và nó cần được cập nhật.

Nếu có một số nhiệm vụ cần được thực hiện cả khi mô-đun được cài đặt và khi mô-đun được cập nhật, thì mã phải có trong cả hai hook. Không có mô-đun nào gọi tất cả các móc cập nhật trong quá trình cài đặt và điều đó đặc biệt sai khi các hàm cập nhật cập nhật lược đồ của các bảng cơ sở dữ liệu được sử dụng từ mô-đun; hook_schema () phải luôn trả về lược đồ được cập nhật và việc cập nhật lược đồ cũng với các hàm cập nhật sẽ bị sai.

Mã bạn đã viết không hoạt động vì gọi một trong các chức năng cập nhật sẽ không tự động thực thi tất cả các chức năng cập nhật khác.
Gọi các chức năng cập nhật từ việc thực hiện hook_install()là sai, vì gọi sai chức năng cập nhật từ một chức năng khác; nếu có một số mã cần được thực thi từ hai hoặc nhiều hàm cập nhật, thì mã đó sẽ được đặt trong một hàm được gọi từ các hàm cập nhật và từ hook_install(), nếu cần.


5

Móc cài đặt chỉ được gọi khi mô-đun được cài đặt mới, do đó không cần bất kỳ bản cập nhật nào. Các bản cập nhật chỉ được thực hiện khi mô-đun đã được cài đặt, vì vậy nó có thể áp dụng các thay đổi bổ sung.

Ví dụ, để buộc các chức năng cập nhật chạy khi cài đặt, bạn phải thay đổi phiên bản lược đồ của mình:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

Hoặc chạy nó từ drush : drush -y updb.

Xem thêm: Có thể buộc móc cập nhật mô-đun của bạn chạy không?


1

hook_install sẽ không hoạt động với trong mymod.moduletập tin.

Bạn phải đặt hook_installhook_uninstalltrong một tập tin riêng biệtmymod.install

Tôi đoán rằng hook_update_N()cũng nên được đặt trongmymod.install


Trả lời sau khi cập nhật câu hỏi:

Trích dẫn từ một liên kết , Vui lòng kiểm tra số phiên bản của bạn trong tệp thông tin.

Vì tôi đang phát triển riêng tư và không đóng góp, trường 'VERSION' của tôi trong tệp .info của mô-đun của tôi trống hoặc không thay đổi khi tôi cập nhật mô-đun. Tôi thực sự đang sử dụng Subversive cho nhật thực PDT và do đó số phiên bản tệp thông tin của tôi không bao giờ được cập nhật. Do đó, hook_update_6001 của tôi KHÔNG được gọi bởi update.php.

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.