Zaczep do kopiowania pola

15

Mam niestandardowy moduł, który formatuje wyświetlanie pola obrazu, który może przyjmować wiele wartości. Chciałbym wiedzieć, jakiego haka powinienem użyć, aby zduplikować pierwszą wartość pola (np. „[Image1]”) i dodać ją z powrotem na początku tablicy (tak array_unshift()mi się wydaje ), zanim pozostałe funkcje sformatują właściwość wyświetlacz / motyw pola.

Więc co było

  • [image1]
  • [image2]
  • [image3]

staje się

  • [image1]
  • [image1]
  • [image2]
  • [image3]

Następnie omówię je osobno, ale myślę, że już to zrozumiałem.

Obecnie używam hook_field_formatter_view()i próbowałem po prostu dodać go na początku $itemstablicy u góry funkcji, ale to nie działało. Jeśli od razu tablica po tym to widać, ale tylko 3 egzemplarze dostać wyjście; Zakładam, że liczba pól zostanie ustalona gdzie indziej.dprint_r()$items

Szansa G.
źródło
1
Jeśli chcesz po prostu skopiować obraz, może JavaScript jest dobrym rozwiązaniem?
Codium
Nie, przepraszam. Używam js na wynikach, ale muszę zrobić inne rzeczy z danymi, hook_field_formatter_viewale działa to tylko raz na obraz.
Szansa G
Spojrzałem na to w debuggerze i zdziwiłem się, że dodatkowe delty dodane do tablicy są ignorowane.
Adam S,
+1 za twoje pytanie, to ciekawy temat. Ale aby pomóc nam pomyśleć o prawdziwym rozwiązaniu, czy możesz sprecyzować, jaki jest twój główny cel (a więc dlaczego chcesz, aby pierwszy obraz był powielony)? Im więcej informacji wiemy, tym lepsze odpowiedzi możesz uzyskać. :)
Sk8erPeter
Rozwiązałem ten problem za pomocą javascript. Ale żeby odpowiedzieć na twoje pytanie; Próbowałem wdrożyć hoverzoom, który wykorzystuje jeden duży obraz na zestaw, a następnie miniatury wszystkich obrazów, aby umożliwić użytkownikowi przełączanie dużego obrazu.
Szansa G

Odpowiedzi:

1

Zamiast tego chcesz hook_field_formatter_prepare_view () . Zauważ, że ten haczyk działa na grupie bytów, a nie na jednym.

Oto działający fragment kodu. Potrzebna jest pewna tablica-fu, aby nie napisać brzydkiej pętli dziesięciu linii, ponieważ delty muszą być zachowane liniowo.

<?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;
  }
}
jonhattan
źródło
0

hook_field_formatter_view()jest miejscem, w którym kod tworzy wynik, który jest pokazywany użytkownikowi, więc chce tablicy renderowalnej jako wartości zwracanej. Więc po prostu przetworz pierwszy obraz dwa razy i nadaj mu inną klasę css lub coś takiego.

Coś jak:

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

Ponieważ hook_field_formatter_view()oczekuje tablicy do renderowania, a ponieważ tablice do renderowania są oznaczane jako renderowane podczas renderowania, po prostu utworzenie dwóch odwołań do tego samego obiektu spowoduje, że jeden zostanie renderowany, oznaczony jako renderowany, a następnie zignorowany następnym razem.

paul-m
źródło
Przykro mi Paul, ale czy przeczytałeś moje pytanie? Byłem w stanie dodać go na początku tablicy przedmiotów. Problem polegał na tym, że nadal nie był produkowany.
Szansa G
hook_field_formatter_view () pobiera pola i musisz je przekształcić w tablice do renderowania. Jeśli po prostu utworzysz dwa odwołania do tej samej tablicy, ten element zostanie oznaczony jako renderowany i nie będzie renderowany ponownie. Musisz więc stworzyć nową tablicę do renderowania dla każdego elementu, który chcesz.
paul-m
Czy to jest odpowiedź?
paul-m
Nie. Jestem w stanie dodać dodatkowy element do tablicy. Gdy dpm pokazuje tablicę, którą pokazuje, po prostu nie drukuje. Akceptuję wszystkie prawidłowe odpowiedzi.
Szansa G
Jak wspomniałem, system renderowania oznacza elementy jako już renderowane. Oznacza to, że jeśli po prostu przekażesz drugi obraz przez odniesienie, zostanie on oznaczony jako renderowany za pierwszym razem, a następnie NIE będzie renderowany za drugim razem, ponieważ jest już zaznaczony.
paul-m