Haken für Feldduplikation

15

Ich habe ein benutzerdefiniertes Modul, das die Anzeige eines Bildfelds formatiert, das mehrere Werte annehmen kann. Ich möchte wissen, welchen Hook ich verwenden soll, um den ersten Wert des Feldes zu duplizieren (z. B. "[image1]") und ihn wieder an den Anfang des Arrays zu setzen ( array_unshift()ich vermute), bevor der Rest meiner Funktionen das formatiert Anzeige / Thema des Feldes.

Also was war

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

wird

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

Ich werde sie dann separat thematisieren, aber ich denke, ich habe diesen Teil bereits herausgefunden.

Ich verwende gerade hook_field_formatter_view()und habe versucht, es am Anfang des $itemsArrays oben in der Funktion einzufügen, aber das schien nicht zu funktionieren. Wenn ich sofort dprint_r()das $itemsArray danach zeige, werden aber nur 3 Items ausgegeben; Ich gehe davon aus, dass die Anzahl der Felder an anderer Stelle bestimmt wird.

Chance G
quelle
1
Wenn Sie nur ein Bild kopieren möchten, ist vielleicht Javascript der richtige Weg?
Codium
Nein, tut mir leid. Ich benutze js für die Ergebnisse, aber ich muss andere Dinge mit den Daten machen, hook_field_formatter_viewaber es läuft nur einmal pro Bild.
Chance G
Ich habe es mir in einem Debugger angesehen und war überrascht, dass dem Array zusätzliche Deltas hinzugefügt wurden, die ignoriert wurden.
Adam S
+1 für Ihre Frage, es ist ein interessantes Thema. Aber um uns zu helfen, über die wirkliche Lösung nachzudenken, können Sie genauer sagen, was Ihr Hauptzweck ist (also der Grund, warum Sie das erste Bild duplizieren möchten)? Je mehr Informationen wir kennen, desto bessere Antworten erhalten Sie. :)
Sk8erPeter
Ich habe dieses Problem mit Javascript gelöst. Aber um deine Frage zu beantworten; Ich habe versucht, Hoverzoom zu implementieren, das ein großes Bild pro Satz und dann Miniaturansichten aller Bilder verwendet, damit der Benutzer das große Bild wechseln kann.
Chance G

Antworten:

1

Sie möchten stattdessen hook_field_formatter_prepare_view () . Beachten Sie, dass dieser Hook für eine Gruppe von Entitäten ausgeführt wird, nicht für eine einzelne.

Hier ist ein funktionierender Ausschnitt. Einige Array-Fu werden benötigt, um keine hässliche Schleife von zehn Zeilen zu schreiben, da Deltas linear erhalten bleiben müssen.

<?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
quelle
0

hook_field_formatter_view()In Ihrem Code wird die Ausgabe erstellt, die dem Benutzer angezeigt wird, und daher wird ein darstellbares Array als Rückgabewert benötigt. Verarbeiten Sie das erste Bild also einfach zweimal und geben Sie ihm eine andere CSS-Klasse oder so.

Etwas wie:

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

Da hook_field_formatter_view()ein renderbares Array erwartet wird und renderbare Arrays beim Rendern als gerendert markiert werden, wird beim Rendern eines als gerendert markiert und beim nächsten Mal ignoriert, wenn nur zwei Verweise auf dasselbe Objekt erstellt werden.

paul-m
quelle
Es tut mir leid, Paul, aber hast du meine Frage gelesen? Ich konnte es an den Anfang des Feldes Elemente hinzufügen. Das Problem war, dass es immer noch nicht ausgegeben wurde.
Chance G
hook_field_formatter_view () ruft Felder ab und Sie müssen sie in renderbare Arrays umwandeln. Wenn Sie nur zwei Verweise auf dasselbe Array erstellen, wird dieses Element als gerendert markiert und nicht erneut gerendert. Sie müssen also für jedes Element, das Sie möchten, ein neues darstellbares Array erstellen.
Paul-m
Ist das die Antwort?
Paul-M
Nein. Ich kann dem Array ein zusätzliches Element hinzufügen. Wenn ich das Array dpm, das es zeigt, druckt es einfach nicht. Ich akzeptiere alle richtigen Antworten.
Chance G
Wie ich bereits erwähnte, markiert das Rendersystem Elemente als bereits gerendert. Das heißt, wenn Sie einfach ein zweites Bild als Referenz übergeben, wird es beim ersten Mal als gerendert und beim zweiten Mal NICHT gerendert, da es bereits markiert ist.
Paul-m