Móc của tôi không được gọi bởi Drupal


9

Tôi đang phát triển một mô-đun, nhưng các hook tôi đang thêm không được gọi từ Drupal. Nó xảy ra với nhiều hơn một hook.

Tôi đọc tài liệu cho các hook và tôi không thể tìm thấy bất cứ điều gì có thể giải thích tại sao điều này xảy ra. Tôi xác nhận rằng tôi đang sử dụng các tham số chính xác và trả về giá trị chính xác.

Tôi đang làm gì sai? Có điều gì tôi đang thiếu?


Câu hỏi này được coi là câu hỏi kinh điển cho những câu hỏi về móc không được Drupal viện dẫn.
kiamlaluno

Câu trả lời:


13

Khi phát triển một mô-đun, bạn nên ghi nhớ các lưu ý sau.

  • Việc thực hiện một hook được thực hiện từ một mô-đun là một chức năng có tên được đặt trước với tên viết tắt của mô-đun (còn được gọi là tên máy ); từ tên hook, tháo phần hook và thay thế nó bằng tên máy mô-đun. Ví dụ, việc thực hiện hook_menu()được thực hiện từ example.module là example_menu(). Nếu mô-đun là example_menu.module và hàm là example_menu(), điều đó không được coi là việc hook_menu()thực hiện cho example_menu.module.
    Điều này cũng có nghĩa là, ví dụ, việc hook_form_alter()triển khai trong example_form.module không phải example_form_alter(), nhưng example_form_form_alter(). Một ví dụ khác, việc triển khai thực hook_form_FORM_ID_alter()hiện để thay đổi biểu mẫu được trả về user_register_form()từ example.module không phải là example_form_user_register_alter(), nhưngexample_form_user_register_form_alter(). (ID biểu mẫu là user_register_form .)

  • Nói chung, việc sử dụng các ký tự viết hoa trong tên máy mô-đun không tạo ra vấn đề: PHP không tạo ra sự khác biệt giữa myModule_get_value(), và mymodule_get_value(), $value = myModule_get_value()sẽ gọi một trong hai myModule_get_value(), hoặc mymodule_get_value().
    Mặc dù, có một trường hợp sử dụng các ký tự chữ hoa trong tên máy của mô-đun sẽ gây ra sự cố: khi xác định móc cập nhật cho mô-đun. drupal_get_schema_versions(), hàm trả về danh sách các bản cập nhật có sẵn, chứa mã sau đây.

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }
    

    Dòng cuối cùng được thực hiện từ drupal_get_schema_versions()là dòng sau.

    return empty($updates[$module]) ? FALSE : $updates[$module];

    Nếu tên mô-đun là myModule.module, drupal_get_schema_versions('myModule')sẽ chỉ trả về các hàm có tên bắt đầu bằng myModule_update và kết thúc bằng một số; các hàm như mymodule_update_7120()sẽ không được bao gồm vì biểu thức chính quy được sử dụng drupal_get_schema_versions()là phân biệt chữ hoa chữ thường. Điều này vẫn áp dụng cho Drupal 8, vì biểu thức chính quy vẫn được sử dụng tương tự trong Drupal 7.

  • Một số móc được gọi trong những thời điểm cụ thể. Ví dụ, hook_menu()hook_menu_alter()được gọi từ Drupal 7 sau khi mô-đun đã được bật / tắt hoặc khi bộ đệm cho thông tin bộ định tuyến bị xóa; hook_init()không được gọi cho các trang được lưu trữ.
    Khi các hook được gọi vì một sự kiện cụ thể đã xảy ra, chúng sẽ không được gọi lại cho đến khi một sự kiện tương tự không xảy ra. Họ không được gọi trong hai yêu cầu trang liên tiếp.

  • Drupal lưu trữ danh sách các hook được thực hiện từ một mô-đun. Nếu bạn đang chỉnh sửa mã của mô-đun được bật để thêm móc mới, trước tiên bạn cần tắt và bật lại mô-đun, hoặc Drupal sẽ không nhận thấy có móc mới.

  • Đảm bảo rằng một returncâu lệnh không lẻn vào một trong các hàm hook của bạn trong quá trình tái cấu trúc. Nó có khả năng phá vỡ không chỉ cái móc mà nó xuất hiện, mà còn gây ra phản ứng dây chuyền phá vỡ các móc khác, làm cho vấn đề khó xác định.


Cũng có thể đáng để đề cập đến sai lầm của tôi vì lợi ích của người khác trong tương lai: KHÔNG định nghĩa một không gian tên trong tệp .module của bạn (hoặc bất kỳ tệp PHP "phẳng", không phải lớp nào khác). Nếu không, Drupal sẽ không nhận ra tệp của bạn, do đó sẽ không phát hiện ra các móc được xác định trong chúng.
Balu Ertl
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.