Trích xuất một phần dữ liệu cụ thể của Mục Bộ sưu tập Trường


7

Tôi đã chơi xung quanh với điều này cho phần tốt hơn của một vài ngày nay không có may mắn. Đây là dữ liệu Bộ sưu tập của tôi:

Tên bộ sưu tập: field_video_collection

Trong bộ sưu tập có một trường gọi là: field_video_file_col

Các trường của tôi in tốt trong field-collection-item--field_video_collection.tpl.phpmẫu tùy chỉnh của tôi , tôi đã theo dõi tài liệu theo vấn đề này để lấy tên mẫu của mình và tôi chỉ cần in các trường như <?php print render($content['field_video_file_col']); ?>vv ... trong mẫu đó.

Bây giờ là phần thú vị, tôi muốn trích xuất fidtừng field_video_file_colmục trong bộ sưu tập trong bất kỳ nút đã cho nào và hiển thị nó dưới dạng một biến được in. Tôi đã làm theo câu trả lời trong câu hỏi này ở đây trên Stack nhưng dường như nó không hoạt động với tôi. nếu tôi làm:

print '<pre>';
var_dump(get_defined_vars());
print '</pre>';

Tôi thấy tôi có cái này như một phần dữ liệu có sẵn cho tôi field_video_file_col

["field_video_file_col"]=>
          array(1) {
            ["und"]=>
            array(1) {
              [0]=>
              array(12) {
                ["fid"]=>
                string(3) "888"

Vì vậy, theo tôi, FID là 888 trong trường hợp này và tôi muốn kết xuất nó trong mẫu của mình. Chức năng tiền xử lý nút của tôi là như vậy:

function MYTHEME_preprocess_node(&$vars, $hook) {

    $entity_type = 'field_collection_item';
    $bundle_name = 'field_field_video_collection'; // Field name the collection is attached to
    $field_name = 'field_video_file_col'; // Field name within the field collection
    $video_file_fid = field_info_instance($entity_type, $field_name, $bundle_name);
    if ($video_file_fid) {
      $my_fid = $video_file_fid['fid'];
    }
}

Kết quả cuối cùng cần thiết là tôi cần hiển thị biến trong mẫu trường-bộ sưu tập-mục - trường_video_collection.tpl.php của mình dưới dạng:

<?php print $video_file_fid; ?>

... nhưng điều này dường như không hoạt động. Tôi đã tìm kiếm khắp nơi và thử nhiều hóa thân khác nhau của mã và kết hợp này nhưng vẫn không có niềm vui.


Bạn đã thay đổi MYTHEME thành tên chủ đề của bạn phải không? :)
Lance

@Lance - vâng tôi đã thay đổi nó.
Daniel Englander

Câu trả lời:


8

Tôi sử dụng API thực thể khi làm việc với các mục Bộ sưu tập trường. Xem: Lập trình tạo và cập nhật bộ sưu tập trường với API thực thể

Để làm việc với các bộ sưu tập trường có thể làm smth như thế này:

// Wrap node with Entity API
$node_wrapper = entity_metadata_wrapper('node', $node);
// Get the first item from the muli-value field collection
$raw_collection = $node_wrapper->field_video_collection[0]->value();
// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
//dsm the old value
debug($collection->field_video_file_col->value());

Nếu bạn đã biết id trường_collection của mình, bạn có thể thực hiện:

$collection = entity_metadata_wrapper('field_collection_item', $fid);
//dsm the old value
debug($collection->field_video_file_col->value());

CẬP NHẬT:

sử dụng mã ở trên trong MYTHEME_preprocess_node

CẬP NHẬT 2:

Vì vậy, trong trường hợp của bạn, nó sẽ là:

function MYTHEME_preprocess_node(&$vars, $hook) {
  if (empty($vars['nid'])) {
    return;
  }
  // Wrap node with Entity API
  $node_wrapper = entity_metadata_wrapper('node', $vars['nid']);
  // Get the first item from the muli-value field collection
  $raw_collection = $node_wrapper->field_video_collection[0]->value();
  // Wrap field collection with Entity API
  $collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
  // print value
  $fid = $collection->field_video_file_col->value();
  debug($fid);
}

Ngoài ra, bạn có thể tìm thấy câu trả lời tại Tìm hiểu giá trị bộ sưu tập trường


Tôi làm theo mã của bạn ở trên một chút nhưng tôi không thấy cách này tạo và hiển thị một biến trong mẫu bộ sưu tập trường tùy chỉnh của tôi vì vậy tôi không chắc câu trả lời này có sử dụng thực tế cho tôi không.
Daniel Englander

1
bạn sẽ dán mã của anh ấy vào MYTHEME_preprocess_nodehàm của bạn và đặt biến của bạn vào một $variablesgiá trị mà mã mẫu của bạn không làm được. Anh ấy chỉ cho bạn cách lấy tham chiếu đến field_collectionchính thực thể từ nút của nó, và sau đó làm thế nào để lấy trường trong câu hỏi từ bộ sưu tập. Bạn lấy chức năng tiền xử lý của mình và đưa mã của anh ta vào đó. Vì vậy, bạn có thể viết biến sau đây để có trong hàm tiền xử lý. $vars['video_file_fid'] = $collection->field_video_file_col->value();
tenken

@tenken cảm ơn. Danny theo dõi bình luận của tenken. Chỉ cần sử dụng entity_metadata_wrapper trong MYTHEME_pre process_node
milkovsky

Tôi đã đọc các bài đăng mà bạn đã liên kết trước khi tôi thực sự đăng câu hỏi này và thực sự không thể thực hiện được những câu chuyện hay câu chuyện về nó. Sử dụng mã từ phía trên, tôi nhận được WSODs. Tôi cũng thấy một thông báo rằng biến node_wrapperkhông được sử dụng ở bất cứ đâu.
Daniel Englander

Xem ví dụ trong CẬP NHẬT 2. Nhưng vui lòng kiểm tra tên trường ("field_video_collection" và "field_video_file_col") PS Bạn đã đúng, nên có $ node_wrapper thay vì $ nút.
milkovsky

-1

Bạn có thể thử cái này Dòng đầu tiên nhận được đối tượng, dòng thứ hai fid từ nó.

$field_video_col=current(current($vars["field_video_file_col"]));
$video_file_fid=$field_video_col['fid'];

currentlấy đối số bằng tham chiếu, vì vậy bạn cần đặt chúng trong các biến riêng biệt.

Điều này đã không làm việc. Tôi đang nhận được một tin nhắn:Unused local variable 'video_file_fid'. The value of the variable is not used anywhere.A variable is considered unused in the following cases: * The value of the variable is not used anywhere or is overwritten immediately. * The reference stored in the variable is not used anywhere or is overwritten immediately
Danny Englander

Hãy tái cấu trúc như thế này sau đó $ tmp = current ($ vars ["field_video_file_col"]); $ field_video_col = hiện tại ($ tmp); $ video_file_fid = $ field_video_col ['fid]; tiếng vang ($ video_file_fid);
Mauro Sardu

Mã mới ở trên cũng không hoạt động. Ngoài ra còn có một lỗi cú pháp ['fid]nên ['fid']nhưng đó của bên cạnh điểm.
Daniel Englander

-1

Mã từ dropbucket có thể hữu ích để lấy và chuẩn bị tất cả dữ liệu của bộ sưu tập trường thành một mảng:

$fieldname = 'field_lorem_slides';

// Get the items
$slides = array();
foreach($vars[$fieldname] as $delta => $item_id){
    $data = field_collection_item_load($item_id['value']);
    if ($data)){
                $l = isset($data->language) ? $data->language : LANGUAGE_NONE;
        $slides[$delta] = array();

                // Get the field collection's data prepared in an array
                // Alternatively, you could do $slides[$delta] = $data; in order to get the full objects in the array 
        $slides[$delta]['lorem_image'] = '<img src="'.file_create_url($data->field_image[$l][0]['uri']).'">';
        $slides[$delta]['lorem_data'] = isset($data->field_heading[$l]) ? $data->field_heading[$l][0]['safe_value'] : null;
    }
}

// Send the information to the template file
// $vars['slides'] = $slides;

Đây có phải là một chức năng tiền xử lý mẫu? Nếu vậy nó là một trang tiền xử lý hoặc chức năng nút? Tôi không thấy bất kỳ bối cảnh nào nên tôi nghĩ chỉ cần liên kết với một đoạn mã mà không cần giải thích là không quá hữu ích.
Daniel Englander

Có, nó có nghĩa là để sử dụng trong các chức năng tiền xử lý. Nhân tiện, khi nhóm tôi làm việc đang vật lộn với các bộ sưu tập trường, phương pháp hiệu quả nhất được tìm thấy là cài đặt mô-đun phát và sử dụng dsm () để khám phá các biến trong các mẫu và các hàm tiền xử lý. Bộ sưu tập trường là một con lợn theo chủ đề, một phần vì (theo cách nhìn của tôi), chức năng tiền xử lý trường của chúng được gọi cả cho trường bộ sưu tập trường và các mục riêng lẻ trong đó.
Alfred Armstrong

Vì vậy, nó là một _preprocess_node, _preprocess_pagechức năng hay khác?
Daniel Englander

Đó sẽ là tiền xử lý.
Alfred Armstrong

Tôi mệt mỏi với nhiều cách khác nhau nhưng không thể làm cho nó hoạt động trong bối cảnh tôi đang làm, nó dường như không phải là táo với táo.
Daniel Englander
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.