Gancio per duplicazione sul campo


15

Ho un modulo personalizzato che sta formattando la visualizzazione di un campo immagine, che può accettare più valori. Vorrei sapere quale hook dovrei usare per duplicare il primo valore del campo (ad esempio "[image1]") e aggiungerlo nuovamente all'inizio dell'array ( array_unshift()suppongo) prima che il resto delle mie funzioni formatta il display / tema del campo.

Quindi cosa era

  • [Image1]
  • [Image2]
  • [Image3]

diventa

  • [Image1]
  • [Image1]
  • [Image2]
  • [Image3]

Ho quindi intenzione di temarli separatamente, ma penso di aver già capito quella parte.

Attualmente sto usando hook_field_formatter_view()e ho provato ad aggiungerlo all'inizio $itemsdell'array nella parte superiore della funzione, ma non sembra funzionare. Se visualizzo immediatamente dprint_r()l' $itemsarray dopo questo, viene visualizzato solo 3 elementi; Suppongo che il numero di campi venga determinato altrove.


1
Se vuoi solo copiare l'immagine, forse Javascript è il modo giusto?
Codium,

No mi dispiace. Sto usando js sui risultati ma ho bisogno di fare altre cose con i dati con hook_field_formatter_viewma funziona solo una volta per immagine.
Chance G

L'ho guardato in un debugger e sono stato sorpreso di scoprire che delta extra aggiunti all'array sono stati ignorati.
Adam S,

+1 per la tua domanda, è un argomento interessante. Ma per aiutarci a pensare alla vera soluzione, puoi essere più specifico quale sia il tuo scopo principale (quindi il motivo per cui vuoi duplicare la prima immagine)? Più informazioni conosciamo, migliori saranno le risposte che potresti ottenere. :)
Sk8erPeter,

Ho finito per risolvere questo problema con JavaScript. Ma per rispondere alla tua domanda; Stavo cercando di implementare l'hoverzoom, che utilizza un'immagine grande per set e quindi le miniature di tutte le immagini per consentire all'utente di cambiare l'immagine grande.
Probabilità G

Risposte:


1

Si desidera invece hook_field_formatter_prepare_view () . Nota che questo hook funziona su un gruppo di entità, non su un singolo.

Ecco uno snippet funzionante. È necessario un certo array-fu per non finire per scrivere un brutto ciclo di dieci righe, poiché i delta devono essere mantenuti lineari.

<?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()è dove il tuo codice produce l'output mostrato all'utente, e quindi vuole un array renderizzabile come valore di ritorno. Quindi basta elaborare due volte la prima immagine e assegnarle una classe css diversa o qualcosa del genere.

Qualcosa di simile a:

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

Poiché si hook_field_formatter_view()aspetta un array renderizzabile e poiché gli array renderizzabili vengono contrassegnati come renderizzati quando vengono renderizzati, semplicemente facendo due riferimenti allo stesso oggetto ne verrà eseguito il rendering, contrassegnati come renderizzati e successivamente ignorati la volta successiva.


Mi dispiace Paul, ma hai letto la mia domanda? Sono stato in grado di aggiungerlo all'inizio dell'array articoli. Il problema era che non veniva ancora prodotto.
Probabilità G

hook_field_formatter_view () ottiene i campi e devi trasformarli in array renderizzabili. Se si fanno solo due riferimenti allo stesso array, quell'elemento verrà contrassegnato come renderizzato e non renderizzato di nuovo. Quindi devi creare un nuovo array renderizzabile per ogni elemento che desideri.
paul-m,

È questa la risposta?
paul-m,

No. Sono in grado di aggiungere un ulteriore elemento alla matrice. Quando dpm l'array che mostra, semplicemente non stampa. Accetto tutte le risposte corrette.
Probabilità G

Come ho già detto, il sistema di rendering contrassegna gli elementi come già renderizzati. Ciò significa che se si passa semplicemente una seconda immagine come riferimento, verrà contrassegnata come renderizzata la prima volta, quindi NON renderizzata la seconda volta, poiché è già contrassegnata.
paul-m
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.