Chia sẻ giá trị giữa hai móc khác nhau


7

Tôi có 2 hàm hook trong mô-đun của mình: hook_views_pre_render()hook_form_alter(); trong hook_views_pre_render(), tôi lấy một số dữ liệu về những nút có sẵn mà tôi cần hook_form_alter().

Tôi đang tìm cách truyền dữ liệu từ hook_views_pre_render()đến hook_form_alter(). Nó có vẻ đơn giản, nhưng tôi không thể làm cho nó hoạt động. Có ai có ý kiến ​​gì không?

Những gì hoạt động vào lúc này là thêm global $aVariablevào cả hai chức năng hook, nhưng tôi tin rằng nên có một cách tốt hơn.

Câu trả lời:


3

1
Nếu dữ liệu thay đổi trang này sang trang khác, thì phương pháp này sẽ thất bại một cách kỳ lạ khi hai người dùng xem cùng một trang.
mpdon Arena

Tôi đã không kết thúc việc sử dụng cái này vì form_alter được gọi trước lượt xem_pre numnder vì vậy dữ liệu tôi muốn chia sẻ thậm chí không có ở đó. Nhưng trong khái niệm sử dụng biến_set và get hoạt động, nhưng toàn cầu cũng vậy.
dazz

Giải pháp này chỉ hoạt động nếu trang web của bạn chỉ có một người dùng. Ai sử dụng Drupal cho các trang web người dùng đơn? Ngoài ra, nó là chậm.
rudolfbyker

@rudolfbyker Bạn có thể nói nó hoạt động với một giá trị duy nhất, không phải cho một người dùng. Và "giá trị đơn" gây tranh cãi vì bạn có thể sử dụng dữ liệu tuần tự ... Và nó chậm so với cái gì?
Stefan

1. Xem bình luận đầu tiên của MPD. Đó là vì biến_set không đặt biến duy nhất cho mỗi người dùng, nhưng ghi vào cơ sở dữ liệu, khiến biến đó thay đổi cho tất cả người dùng hiện đang truy cập trang web của bạn. 2. Chậm so với bất kỳ giải pháp nào không trúng cơ sở dữ liệu.
rudolfbyker 7/07/2015

8

Trong Drupal 7, drupal_static () cũng có thể được sử dụng, nếu giá trị được lưu trữ không cần phải tồn tại giữa các trang khác nhau.

drupal_static()thường được gọi là drupal_static(__FUNCTION__, $default_value), nhưng nếu bạn sử dụng tên của hàm, bạn có thể truy cập cùng giá trị được truy cập từ hàm gọi drupal_static().

Việc sử dụng variable_set()variable_get()giá trị là liên tục giữa các trang khác nhau và nó không tự động bị xóa. Nếu hook đầu tiên thực thi mã tương tự như sau, mô-đun thứ hai sẽ nhận được giá trị cũ hơn.

if ($condition) {
  variable_set($variable_name, $value);
}

Thay vì sử dụng mã như vậy, hook đầu tiên sẽ thực thi mã tương tự như sau.

if ($condition) {
  variable_set($variable_name, $value);
}
else {
  variable_del($variable_name);
}

Dù bạn chọn phương pháp nào, hãy chắc chắn rằng hook đọc giá trị đang chạy hiệu quả sau khi cài đặt hook đó.


Bạn đề cập đến drupal_static có thể được sử dụng để chuyển các giá trị giữa hook_fifts. Bạn có thể vui lòng cập nhật câu trả lời của mình để hiển thị một ví dụ rõ ràng về việc sử dụng drupal_static để đặt giá trị trong một hàm và sau đó gọi dữ liệu đó trong một hàm riêng biệt không?
blue928

Ngoài ra, bạn có thể giải thích thêm về cách đảm bảo bộ biến được kích hoạt trước khi nhận được biến không? Có cách nào để đưa ra "ưu tiên lửa móc" hoặc trọng lượng cho móc để chúng bắn theo thứ tự ưu tiên không?
blue928

@ blue928 Không, không có cách nào để Drupal gọi một cái móc trước là một cái móc khác; chỉ có một cách để ra lệnh thực hiện khác nhau của cùng một hook.
kiamlaluno

Trong cả hai trường hợp, các hook gọi drupal_static()&drupal_static($value_name, $default_value). Hàm thiết lập giá trị thường sử dụng __FUNCTION__$value_name, nhưng điều đó là không cần thiết; miễn là hàm không tạo ra xung đột với các hàm khác, bất kỳ giá trị nào cũng tốt, mặc dù tiền tố của nó có __FUNCTION__trợ giúp.
kiamlaluno

0

Nếu bạn cần truyền thông tin chỉ có sẵn hook_views_pre_rendercho hook_form_altermột biến toàn cục có thể là lựa chọn tốt nhất của bạn; tốt nhất là được đặt tên để làm cho vai trò hạn chế của nó rõ ràng, ví dụ , _mymodule_available_nodes.

Cách tiếp cận tốt nhất sẽ là thêm dữ liệu của bạn vào bất kỳ đối tượng nào mà hai cuộc gọi có điểm chung. Trong trường hợp này không may, dường như không có điểm chung, vì vậy điều này sẽ không hoạt động.

Bạn có thể sử dụng dữ liệu phiên, nhưng điều đó sẽ quá mức cho ứng dụng này và dường như không mang lại lợi ích rõ ràng trên toàn cầu.

Tôi không khuyên bạn nên sử dụng biến_set / biến_get. variable_setxóa bộ nhớ cache biến trên mỗi cuộc gọi, cộng với tất cả các giá trị biến được tìm nạp trên mỗi yêu cầu trang. Đây không phải là một kết hợp tốt cho dữ liệu luôn thay đổi và có kích thước lớn.


Trong Drupal 7, drupal_static () có thể được sử dụng cho việc này không?
kalabro

Một biến tĩnh là cục bộ của hàm nhưng vẫn giữ giá trị giữa các cuộc gọi. OP muốn một cách để giao tiếp giữa các chức năng vì vậy điều này không áp dụng. drupal_static cung cấp một phương thức lưu trữ dữ liệu tĩnh có thể được đặt lại và thao tác từ bên ngoài hàm xác định.
keithm

2
Biến được trả về bởi drupal_static()local drupal_static(), nhưng hàm trả về giá trị của biến theo tham chiếu; điều này có nghĩa là hàm gọi có thể thay đổi giá trị của biến ngay cả khi đó là biến cục bộ tĩnh cho drupal_static().
kiamlaluno
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.