Thực hành tốt nhất khi làm việc với ngôn ngữ [und] là gì?


51

Tôi đang bắt đầu sử dụng biểu mẫu này để truy cập dữ liệu trong mô-đun của mình. (Xem bình luận # 1. )

$node->field_test[$node->language][0]['value']

Tôi nghĩ rằng nó trông giống như một giải pháp khá tốt, nhưng xa hơn câu hỏi tương tự tôi đã tìm thấy điều này :

Đừng cho rằng 'und' dành cho các trường của các thực thể không có ngôn ngữ, nó cũng dành cho các trường không thể dịch và không có mô-đun dịch thực thể là tất cả các trường. Hơn nữa, có sự khác biệt về điều này giữa các phiên bản 7.x khác nhau của Drupal.
Tốt hơn là sử dụng field_get_items()chức năng sẽ sắp xếp cho bạn theo mã ngôn ngữ nào mà dữ liệu được lưu trữ.

Và bây giờ tôi không biết liệu những gì tôi đang sử dụng có thể phá vỡ thứ gì đó không.

Câu trả lời:


39

Tôi thấy rằng việc sử dụng mô-đun Entity API là một trợ giúp tuyệt vời và cũng làm cho mã dễ đọc hơn. Đoạn mã trên không phải lúc nào cũng hoạt động, vì ngôn ngữ của nút và ngôn ngữ của trường có thể khác nhau.

Với mô-đun API thực thể và trình bao bọc của nó, bạn có thể sử dụng mã sau đây:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Đây phải là bằng chứng đạn. Một điều về việc sử dụng mô-đun thực thể là nếu bạn cố truy cập vào một trường không tồn tại, bạn sẽ gặp một lỗi khó chịu và một ngoại lệ được ném thay vì thông báo và hành vi sai.

Để tránh điều này, bạn có thể thử / bắt như thế này

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Hoặc bạn có thể sử dụng isset()EntityMetadataWrapperxử lý nội bộ:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Chức năng này entity_metadata_wrapper()đã bị phản đối? Tôi đã thử gọi nó trong mô-đun của mình và tôi đã nhận được Fatal error: Call to undefined function entity_metadata_wrapper()- Tôi cũng đã thực hiện tìm kiếm nguồn trên bản cài đặt Drupal 7.12 trong Dreamweaver và nhận được 0 kết quả ở bất kỳ nơi nào khác trong mã!
MP Aditya

1
aditya - đây là trong mô-đun Entity API - không phải trong lõi.
lazysoundystem

1
@adityamenon Giống như lười biếng nói rằng điều này không phải là cốt lõi ... tuy nhiên, nó có thể sẽ dành cho Drupal 8. Các API thực thể ít nhất sẽ được cải thiện rất nhiều. Thực sự không có thời gian để tạo tất cả các API cần thiết cho hệ thống thực thể cho Drupal 7, vì vậy đó là những gì mô-đun API thực thể cố gắng đạt được.
googletorp

Cảm ơn các bạn, tôi thật ngu ngốc khi không đọc câu trả lời đúng và theo liên kết đến trang dự án Entity API :)
Aditya MP

1
Khi tôi xem qua mã nguồn cho entity_metadata_wrapper và theo dõi đường mòn thỏ qua tất cả các lớp được khởi tạo và mở rộng để cho tôi thao tác trường dễ dàng hơn, tôi tự hỏi liệu tất cả có đáng không. Thêm 3k + dòng mã khác vào bootstrap của tôi và chiếm thêm bộ nhớ để xử lý tất cả các bài tập biến ... có gì nhẹ hơn không? Có vẻ như đó $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';thực sự là cách hiệu quả nhất.
Charlie Schliesser

19

Để đọc, bạn phải luôn có thể sử dụng field_get_items () , ngôn ngữ này sẽ chọn ngôn ngữ chính xác cho bạn và cũng kiểm tra xem trường có bất kỳ giá trị nào không.

Thật không may, API trường rất hạn chế trong 7.x, không có cách nào để lấy ví dụ: mục trường đầu tiên, thậm chí không dám hỏi về việc nhận giá trị với một lệnh gọi hàm duy nhất ... Và không có trường_set_items ( ) đối tác.

Vì vậy, có, mô-đun thực API không cung cấp một API đẹp hơn với các nhược điểm mà nó cũng đi kèm với khá nhiều chi phí (Về cơ bản nó chuyển đổi mỗi giá trị duy nhất để đối tượng wrapper có tấn của các mảng thông tin thuộc tính lồng nhau gắn liền với chúng). Cố gắng kết xuất một trình bao bọc thực thể thường sẽ giúp bạn không có gì hoặc một bức tường của các mảng không thể đọc được.


1
Tôi có ấn tượng từ những gì bạn đang nói rằng loại điều này sẽ được cải thiện trong Drupal 8? Nếu vậy làm thế nào để đi tìm hiểu làm thế nào những thứ này đang tiến triển? Ngoài các trang mô-đun, Do giống như một mê cung đối với tôi! :)
Clive

1
Chà, luôn có hy vọng :) Và thật khó để giữ được một cái nhìn tổng quan cấp cao về những gì đang diễn ra trong Drupal 8, một cách là theo dõi các hoạt động. Tuy nhiên, đây không phải là mục tiêu trực tiếp của các chỉ thị hiện có. Các phần của mô-đun API thực thể được di chuyển / được chuyển vào lõi (Hiện tại có lớp Thực thể và các thực thể hiện có được chuyển đổi sang hệ thống mới). Vì vậy, có một cơ hội là chúng ta sẽ lấy các phương thức trực tiếp trên các lớp đó để xử lý các trường. Đối với các thay đổi được cam kết, một tài nguyên tốt là hệ thống hồ sơ thay đổi mới, xem drupal.org/list-changes/drupal .
Berdir

Rực rỡ, đó chính xác là thứ mà tôi đang tìm kiếm cảm ơn rất nhiều! :) Hy vọng bạn không bận tâm đến câu hỏi của tôi Tôi biết nó không thực sự thuộc chủ đề của trang web ... Tôi rất muốn tham gia đóng góp vào cốt lõi nhưng chưa bao giờ thực sự tham gia vào nguồn mở một chút nản chí ... thật tốt khi có một nơi tốt để bắt đầu :)
Clive

Clive: Kiểm tra drupalofficehours.org - chính xác là để giúp mọi người bắt đầu với việc đóng góp. Nhiều tài nguyên hơn ở đó. Tôi cũng khuyên bạn nên đi đến một cuộc họp nhóm người dùng rằng các nhà phát triển cốt lõi thường xuyên hoặc nhiều khả năng là một DrupalCamp nơi một hoặc hai nhà phát triển cốt lõi sẽ ở đó. Tìm nhóm địa phương của bạn trên Groups.drupal.org và bạn sẽ có thể tìm ra nó. drupical.org cũng có thể hữu ích.
wizonesolutions

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

Bạn có thể thêm một lời giải thích ngắn cho lý do tại sao điều này trả lời câu hỏi?
Cấp tiến miễn phí
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.