Tại sao đôi khi $ node-> field_name [0] và đôi khi $ node-> field_name ['und'] [0]?


8

Xin lỗi cho mã trong tiêu đề, tôi không thể nghĩ ra một cách rõ ràng hơn để hỏi nó.

Tôi có một số nút thuộc locationloại nội dung và chế độ xem xuất ra các lời trêu ghẹo của các nút đó. Tôi muốn thực hiện một số công cụ tùy chỉnh node--location.tpl.phpđể ảnh hưởng đến những lời trêu ghẹo ở mọi nơi chúng được hiển thị. Khi tôi thực hiện một thao tác đơn giản dpm($node)để nhận các biến, một số giá trị trường không phải lúc nào cũng ở cùng một vị trí.

Ví dụ, tôi có field_phonesố điện thoại được định dạng giống hệt nhau. Đối với nút đầu tiên trong khung nhìn này, trường đó được cấu trúc như $node->field_phone['und'][0]['safe_value']. Nhưng đối với nút thứ hai, nó đơn giản $node->field_phone[0]['safe_value'].

Tôi biết điều đó undcó liên quan đến bản dịch, và có lẽ có nghĩa là "không xác định". Tôi không làm bất cứ điều gì với bản dịch hoặc bản địa hóa hoặc ngôn ngữ trên trang web, vì vậy nó không giống như nút này khác với các nút khác theo cách đó.

Điều gì gây ra điều này, và có một chức năng hoặc một cái gì đó có thể giúp tôi kiểm tra và nhận được giá trị một cách dễ dàng, hoặc tôi phải tự lăn?

EDIT : Chris Rockwell dưới đây chỉ ra field_get_items(). Điều này dường như để giải quyết vấn đề của tôi trên trang web mà tôi đang làm việc vào một ngày khác. Nhưng bây giờ, trên một trang web khác, nó thất bại vì chính xác lý do tôi đưa lên đây.

Tôi có một cái nhìn đầu ra ba nút. Vì một số lý do, khi tôi dpm($node)vào node--node-type.tpl.phptập tin, tôi nhận được sáu bãi chứa biến. Cái đầu tiên$node->field_link_image['und'][0], trong khi tất cả năm cái khác - BAO GỒM bản sao của cùng một nút - chỉ có $node->field_link_image[0]. Và bây giờ, field_get_items()đang âm thầm thất bại và trả về sai trên năm nút cuối cùng.

Vì vậy, tôi quay trở lại câu hỏi ban đầu của mình: Điều gì gây ra sự khác biệt giữa một số biến nút và các biến khác và tôi có thể làm gì về nó?


Tôi chỉnh sửa câu trả lời của tôi. Tôi tin rằng bạn nên sử dụng field_view_value()và đồng bằng trên $itemtruyền cho nó.
Chris Rockwell

Ngoài ra, có field_link_imagechấp nhận nhiều giá trị?
Chris Rockwell

@ 75-trombone Tôi có cùng một vấn đề, bạn đã tìm ra giải pháp chưa?
sepehr

@ 75-trombone bạn đã sử dụng mô-đun gật đầu trong dự án cụ thể đó chưa?
sepehr

Câu trả lời:


8

Việc thiếu dữ liệu 'und'hoặc LANGUAGE_NONEmức độ dường như cho thấy trường đã mất khả năng dịch. Tôi chưa bao giờ gặp phải một lĩnh vực như vậy.

field_get_items()như đã chỉ ra là cách chuẩn để lấy dữ liệu trường một cách an toàn. Bất kỳ trường nào không hoạt động với field_get_items nên được coi là bị hỏng.

Tôi sẽ mạo hiểm đoán rằng bạn hoặc

  1. Có một mô-đun đóng góp bị hỏng sắp xếp lại dữ liệu trường và không biết rõ hơn đôi khi loại bỏ cấp độ ngôn ngữ.
  2. Cài đặt trường của bạn vừa bị hỏng ở đâu đó trên đường đi. Có khả năng vì một lý do tương tự như trên.

Có vấn đề tiếp tục xảy ra trên các lĩnh vực mới được tạo ra?

Bạn có thể sao chép trên một cài đặt sạch?


2
Tôi đã thấy điều này xảy ra, nhưng không lâu lắm, vì vậy tôi không thể chỉ ra một thủ phạm.
mpdon Arena

Tất cả những gì tôi thực sự có thể nghĩ đến lúc đó là mang theo pháo hạng nặng, gỡ lỗi API trường, đây là một đoạn mã khá phức tạp.
Letharion

2
Hơn một năm sau, cuối cùng tôi cũng đã tìm ra vấn đề này là gì, hoặc ít nhất là một phần của nó. Đó là khi tôi sử dụng dpm()trong nút - anything.tpl.php cho một loại nội dung được sử dụng trong dạng xem. Chính dpm() . Khi tôi không chạy dpm(), tất cả các $nodetrường hợp trong chế độ xem đều chính xác. Khi tôi làm, tất cả trừ người đầu tiên có trình độ ngôn ngữ. Khùng.
Trombone thứ 75

Chỉ là, wow .. Cảm ơn @ 75thTrombone đã theo dõi. Tôi vừa mới gỡ lỗi này quá lâu.
enzodes

@ Trombone thứ 75 LÀ QUYỀN !! Vấn đề tương tự ở đây, cảm ơn
Incredible

3

Tôi tin rằng bạn cần một sự kết hợp của field_get_items()field_view_value().

Trong trường hợp của bạn (tôi không thể kiểm tra điều này):

$item = field_get_items('node', $node, 'field_phone'); // unsafe to print
$output = field_view_value('node', $node, 'field_phone', $item[0]);
print $output;

EDIT: Trong đoạn mã trên, dòng 2 ( $output = ...), tôi đã thêm vào $item[0]vì tôi không thấy $itemyêu cầu phải có delta. Điều này cho phép các trường có nhiều giá trị được lặp đi lặp lại và chuyển qua field_view_value(). Tôi tin rằng bạn đang bỏ qua bước quan trọng của việc sử dụng field_view_value().

Nếu sử dụng mã trên (bao gồm field_view_value()) không giải quyết được điều này, tôi sẽ cần thêm thông tin; ví dụ: xem node.tpl.php của bạn và có thể xuất kiểu nội dung.


Tôi nghĩ rằng bạn có một $imagecái cần phải có $item, nhưng field_get_itemschính xác là những gì tôi cần. Kết quả của nó có safe_value(không chỉ là value), nên an toàn để in, phải không? Tôi không cần field_view_valuevì tôi muốn xuất biến trực tiếp, không phải với renderhàm.
Trombone thứ 75

Kết quả đó sẽ an toàn để in, nhưng tôi khá chắc chắn rằng bạn không thể dựa vào safe_valueviệc có mặt. Tôi phải làm một số đào để xác nhận mặc dù. Cảm ơn đã đề cập đến lỗi đánh máy, đã sửa.
Chris Rockwell

Chà, điều này dường như hoạt động trên trang web cuối cùng tôi đã thử, nhưng tôi đang xem xét một trường hợp của nó thất bại ngay bây giờ. Tôi đang mở lại câu hỏi này; xem chỉnh sửa của tôi ở trên.
Trombone thứ 75

Bạn đề cập đến field_get_items()trong bản chỉnh sửa của mình, nhưng không field_view_value()- bạn có đang sử dụng nó không? field_view_value()là một mảng có thể kết xuất, vì vậy bạn sẽ có thể nhận được giá trị trực tiếp từ đó. Ngoài ra, tại sao một người nào đó lại bỏ phiếu trả lời giải quyết vấn đề ban đầu, nhưng dường như không hoạt động cho vấn đề mới?
Chris Rockwell

0

Đây là chức năng tôi đang sử dụng cho đến khi tôi tìm thấy câu trả lời tốt hơn. Ngoài việc khắc phục sự cố ngôn ngữ, nó cũng phải luôn trả về một mảng số, vì vậy bạn có thể tự tin foreachkhi xử lý kết quả.

function get_field($field, $lang = 'en', $fallback = 'en') {
    $var = FALSE;
    if(!empty($field[$lang])) {
        $var = $field[$lang];
    } elseif(!empty($field[$fallback])) {
        $var = $field[$fallback];
    } elseif(!empty($field['und'])) {
        $var = $field['und'];
    } elseif(!empty($field)) {
        $var = $field;
    }

    if(empty($var)) {
        return false;
    }

    if(!empty($var[0])) {
        return $var;
    } else {
        return array($var);
    }
}

-3

Nếu bạn hãy xem https://api.drupal.org/api/drupal/includes%21bootstrap.inc/constant/LANGUAGE_NONE/7 này

đây là một giá trị an toàn hơn để sử dụng và sẽ hoạt động với mọi ngôn ngữ được xác định, kể cả không có ngôn ngữ.


2
Tôi không hiểu làm thế nào điều đó giúp tôi hoặc trả lời câu hỏi của tôi. Nó không bằng cách nào đó giúp tôi có được undphiên bản miễn phí nếu tôi yêu cầu. $node->field_location[LANGUAGE_NONE][0]['safe_value']sẽ thất bại cho nút thứ hai đó nhiều như $node->field_location['und'][0]ý muốn.
Trombone thứ 75
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.