Kết xuất một trường chứa bên trong một trường khác


7

Tôi đang sử dụng mô-đun Drupal Par Đoạn cho phép bạn tạo "gói" các trường bên trong các trường khác. (Nó thực hiện điều này bằng cách sử dụng các thực thể). Mỗi gói có tệp tpl.php của riêng nó.

Ngoài ra, bạn có thể lồng "các gói phụ" bên trong "các gói chính" cho các bố cục phức tạp.

Tôi đã tạo ra một "gói chính" được gọi là field_panels_content.

Bên trong này là một "subbundle" khác chứa a field_body_text. "Gói chính" có thể chứa số lượng "gói phụ" không giới hạn.

Trong chủ đề của tôi, tôi cần truy cập vào tất cả các field_body_texttrường từ nhiều "subbundle" từ tệp tpl.php dành cho "gói chính".

Tôi đã sử dụng devel_themer và thấy rằng tôi có thể đến các field_body_texttrường như thế này:

<?php print render($content['field_panels_content'][0]['entity']['paragraphs_item'][9]['field_body_text']); ?>
<?php print render($content['field_panels_content'][2]['entity']['paragraphs_item'][10]['field_body_text']); ?>
<?php print render($content['field_panels_content'][2]['entity']['paragraphs_item'][12]['field_body_text']); ?>

Như bạn có thể thấy điều này không tạo ra chủ đề hiệu quả vì tôi sẽ cần biết giá trị mảng thứ hai để in ra (ví dụ [9] [10] [12]).

Có cách nào để tôi có thể sử dụng một vòng lặp hoặc một số hàm PHP khác để tự động đến giá trị mảng thứ hai mà không cần biết không?

Giá trị mảng thứ hai này thay đổi theo từng phần nội dung mới (ví dụ: Nếu tôi thêm một lớp con mới, nó sẽ có giá trị là [13]. Lý do các số nhảy từ [10] sang [12] là vì tôi đã xóa lớp con đó [11].



Cập nhật

Dưới đây là một số bước tôi đã thử (từ trang này ):

Đây là một vòng lặp ví dụ:

<?php
foreach ( $content['field_panels_content'] as $wrapper) {
  foreach ( $wrapper['entity']['paragraphs_item'] as $item ) {
    if ( !empty($item['field_body_text']) ) {
      print render($item['field_body_text']);
    }
  }
}
?>

Nó tạo ra các kết quả sau: Không thể sử dụng đối tượng thuộc loại Par ĐoạnsItemEntity làm mảng trong foreach ($ Wrapper ['entity'] ['Đoạns_item'] làm $ item) {

Đây là một phiên bản làm lại:

<?php
foreach ( $content['field_panels_content'] as $wrapper) {
  foreach ( $wrapper['entity'].paragraphs_item as $item ) {
    if ( !empty($item.field_body_text) ) {
      print render($item.field_body_text);
    }
  }
}
?>

Thông báo lỗi: Fatal error: Cannot use object of type ParagraphsItemEntity as array in line "foreach ( $wrapper['entity'].paragraphs_item as $item ) {"

Chỉnh sửa mã để chỉ field_body bản nằm trong dấu ngoặc vuông (ví dụ $item['field_body_text']), tạo thông báo lỗi này: Fatal error: Cannot use object of type ParagraphsItemEntity as array

Chỉnh sửa mã để chỉ đoạn văn_item nằm trong dấu ngoặc vuông (ví dụ $wrapper['entity']['paragraphs_item']), tạo ra thông báo lỗi này: Fatal error: Only variables can be passed by reference in line print render($item.field_body_text);

Nếu tôi sử dụng in thay vì kết xuất, tôi nhận được thông báo lỗi này: Fatal error: Cannot use object of type ParagraphsItemEntity as array



Ghi chú khác

Các mã sau hoạt động hoàn hảo:

<?php print render($content['field_panels_content'][0]['entity']['paragraphs_item'][9]['field_body_text']); ?>
<?php print render($content['field_panels_content'][1]['entity']['paragraphs_item'][10]['field_body_text']); ?>

Vì vậy, chắc chắn nó là một trường hợp đơn giản để cấu trúc lại mã thành một vòng lặp để có được kết quả mong muốn.


Xin lưu ý

Tôi không muốn sử dụng các mô-đun khác.

Tôi sẽ in riêng tất cả các trường_body bản ở đầu tệp tpl. Sau đó tôi sẽ hiển thị toàn bộ đoạn văn ( field_body_textvẫn còn trong đó) theo cách thông thường.

Câu trả lời:


4

Tôi nghĩ vấn đề ở đây là mỗi nhóm đoạn đó chứa các phần tử khác nhau là các khóa mảng. Ví dụ: nếu bạn dpm lên đến $ content ['field_par Đoạn'], bạn có thể thấy các giá trị trông như thế này:

nhập mô tả hình ảnh ở đây

Tôi nghĩ vấn đề là do các vòng lặp của bạn, việc bạn cố gắng kết xuất / lặp qua những thứ không phải là đối tượng. Để giải quyết vấn đề này, bạn có thể muốn thử đăng nhập nếu khóa là số trước khi tiếp tục.

Một cái gì đó dọc theo dòng như thế này:

<?php
    foreach($content['field_paragraph'] as $key=>$array){
  if (is_int($key)) {
    foreach ( $array['entity']['paragraphs_item'] as $key2=>$item ) {
    if ( is_int($key2) ) {
      print render($item['field_body']);
    }
  }
  }
}

?>

Lưu ý is_int (khóa $), đó là những gì bạn cần để loại bỏ các lỗi. Lưu ý mã của tôi có tên trường riêng của tôi trong đó, vì vậy bạn sẽ chỉ cần chuyển tên của mình vào.


Tôi bắt đầu một câu trả lời sau đó đọc lại. Điều này là chính xác.
Darvanen

2

Thay vì ghi đè và tạo mẫu, hãy quản lý tất cả hiển thị của thực thể thông qua giao diện người dùng và tạo các trình định dạng trường cho các loại trường khi lõi không đáp ứng các yêu cầu hiển thị của bạn.

Đây là một cách dễ dàng hơn để xác định màn hình, các mẫu trở nên lộn xộn nhanh chóng, đặc biệt là khi đi sâu vào các tài liệu tham khảo.


trong trường hợp của tôi, tôi cần xuất ra một danh sách tất cả các tiêu đề được lưu trữ trong "gói chính". Tôi có thể biết rằng tôi có thể nhúng View a để làm điều này, nhưng tôi chỉ muốn có một danh sách các tiêu đề vì nó sẽ làm cho nó đơn giản hơn. Ngoài ra, tôi cần xuất tiêu đề theo nhiều cách khác nhau trên một trang, do đó, mẫu sạch hơn so với việc có nhiều trình định dạng khác nhau (và giao diện người dùng chỉ cho phép bạn sử dụng một trình định dạng trên mỗi màn hình)
big_smile
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.