Móc để sao chép trường


15

Tôi có một mô-đun tùy chỉnh định dạng hiển thị trường hình ảnh, có thể chấp nhận nhiều giá trị. Tôi muốn biết tôi nên sử dụng hook nào để nhân đôi giá trị đầu tiên của trường (ví dụ: "[image1]") và thêm nó trở lại đầu mảng (với array_unshift()tôi đoán) trước khi các chức năng còn lại của tôi định dạng hiển thị / chủ đề của lĩnh vực.

Vậy cái gì đã

  • [hình ảnh 1]
  • [hình ảnh 2]
  • [hình ảnh 3]

trở thành

  • [hình ảnh 1]
  • [hình ảnh 1]
  • [hình ảnh 2]
  • [hình ảnh 3]

Sau đó tôi sẽ chuyển sang chủ đề riêng, nhưng tôi nghĩ rằng tôi đã tìm ra phần đó.

Tôi hiện đang sử dụng hook_field_formatter_view()và đã cố gắng chỉ thêm nó vào đầu $itemsmảng ở đầu hàm, nhưng điều đó dường như không hoạt động. Nếu tôi ngay lập tức dprint_r()các $itemsmảng sau này nó cho thấy, nhưng chỉ có 3 hạng mục được đầu ra; Tôi giả định rằng số lượng các lĩnh vực được xác định ở nơi khác.


1
Nếu bạn muốn chỉ sao chép hình ảnh, có lẽ Javascript là cách?
Codium

Không tôi xin lỗi. Tôi đang sử dụng js trên các kết quả nhưng tôi cần thực hiện các công cụ khác với dữ liệu hook_field_formatter_viewnhưng nó chỉ chạy một lần trên mỗi hình ảnh.
Cơ hội G

Tôi đã xem xét nó trong một trình gỡ lỗi và rất ngạc nhiên khi thấy thêm các vùng đồng bằng được thêm vào mảng bị bỏ qua.
Adam S

+1 cho câu hỏi của bạn, đó là một chủ đề thú vị. Nhưng để giúp chúng tôi suy nghĩ về giải pháp thực sự, bạn có thể nói cụ thể hơn mục đích chính của bạn là gì (vậy lý do tại sao bạn muốn hình ảnh đầu tiên được nhân đôi)? Chúng tôi càng biết nhiều thông tin, bạn càng có thể nhận được câu trả lời tốt hơn. :)
Sk8erPeter

Tôi đã kết thúc việc giải quyết vấn đề này với javascript. Nhưng để trả lời câu hỏi của bạn; Tôi đã cố gắng thực hiện hoverzoom, sử dụng một hình ảnh lớn trên mỗi bộ và sau đó hình thu nhỏ của tất cả các hình ảnh để cho phép người dùng chuyển đổi hình ảnh lớn.
Cơ hội G

Câu trả lời:


1

Bạn muốn hook_field_formatter_prepare_view () thay thế. Lưu ý hook này hoạt động trên một nhóm các thực thể, không phải trên một thực thể.

Đây là một đoạn làm việc. Một số mảng-fu là cần thiết để không kết thúc việc viết một vòng lặp xấu xí gồm mười dòng, vì deltas phải được bảo toàn tuyến tính.

<?php

function MODULE_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
  foreach ($entities as $id => $entity) {
    $array = array(0 => $items[$id][0], 1 => $items[$id][0]);
    if (count($items[$id]) > 1) {
      array_splice($array, 2, 0, array_slice($items[$id], 1));
    }
    $items[$id] = $array;
  }
}

0

hook_field_formatter_view()là nơi mã của bạn làm cho đầu ra được hiển thị cho người dùng và vì vậy nó muốn một mảng có thể kết xuất làm giá trị trả về. Vì vậy, chỉ cần xử lý hình ảnh đầu tiên hai lần và cung cấp cho nó một lớp css khác hoặc một cái gì đó.

Cái gì đó như:

$output = array();
if (($field == 'myFieldType') && ($display == 'full')) {
  $output[] = renderFirstImage(reset($items));
  foreach ($items as $item) {
    $output[] = renderImage($item);
  }
}
return $output;

hook_field_formatter_view()mong đợi một mảng có thể kết xuất và vì các mảng có thể kết xuất được đánh dấu là được hiển thị khi chúng được kết xuất, chỉ cần tạo hai tham chiếu đến cùng một đối tượng sẽ khiến một mảng được hiển thị, được đánh dấu là hiển thị và sau đó bỏ qua lần sau.


Tôi xin lỗi Paul nhưng bạn đã đọc câu hỏi của tôi? Tôi đã có thể thêm nó vào đầu của mảng vật phẩm. Vấn đề là nó vẫn không được đầu ra.
Cơ hội G

hook_field_formatter_view () có các trường và bạn phải biến chúng thành các mảng có thể kết xuất. Nếu bạn chỉ thực hiện hai tham chiếu đến cùng một mảng, mục đó sẽ được đánh dấu là được hiển thị và không được hiển thị lại. Vì vậy, bạn phải tạo một mảng kết xuất mới cho mỗi mục bạn muốn.
paul-m

Đây có phải là câu trả lời?
paul-m

Không. Tôi có thể thêm một mục vào mảng. Khi tôi dpm mảng nó hiển thị, nó chỉ không in. Tôi chấp nhận tất cả các câu trả lời là chính xác.
Cơ hội G

Như tôi đã đề cập, hệ thống kết xuất đánh dấu các mục là đã được kết xuất. Điều đó có nghĩa là nếu bạn chỉ đơn giản chuyển một hình ảnh thứ hai bằng tham chiếu, nó sẽ được đánh dấu là được hiển thị lần đầu tiên, và sau đó KHÔNG được hiển thị lần thứ hai, vì nó đã được đánh dấu.
paul-m
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.