Gancho para duplicación de campo

15

Tengo un módulo personalizado que formatea la visualización de un campo de imagen, que puede aceptar múltiples valores. Me gustaría saber qué gancho debería usar para duplicar el primer valor del campo (por ejemplo, "[imagen1]"), y agregarlo nuevamente al comienzo de la matriz ( array_unshift()supongo) antes de que el resto de mis funciones formatee el visualización / tema del campo.

Entonces que era

  • [imagen1]
  • [imagen2]
  • [imagen3]

se convierte

  • [imagen1]
  • [imagen1]
  • [imagen2]
  • [imagen3]

Luego los voy a tema por separado, pero creo que ya tengo esa parte resuelta.

Actualmente estoy usando hook_field_formatter_view(), y he tratado de agregarlo al comienzo de la $itemsmatriz en la parte superior de la función, pero eso no pareció funcionar. Si inmediatamente aparece dprint_r()la $itemsmatriz después de esto, se muestra, pero solo se obtienen 3 elementos; Supongo que el número de campo se determina en otro lugar.

Oportunidad G
fuente
1
Si solo quieres copiar la imagen, ¿quizás Javascript sea el camino?
Codium
No, lo siento. Estoy usando js en los resultados, pero necesito hacer otras cosas con los datos, hook_field_formatter_viewpero solo se ejecuta una vez por imagen.
Chance G
Lo miré en un depurador y me sorprendió encontrar deltas adicionales agregados a la matriz que se ignora.
Adam S
+1 para su pregunta, es un tema interesante. Pero para ayudarnos a pensar en la solución real, ¿puede ser más específico cuál es su propósito principal (entonces, la razón por la que desea duplicar la primera imagen)? Cuanta más información sepamos, mejores respuestas podría obtener. :)
Sk8erPeter
Terminé resolviendo este problema con javascript. Pero para responder tu pregunta; Intenté implementar hoverzoom, que usa una imagen grande por conjunto y luego miniaturas de todas las imágenes para permitir al usuario cambiar la imagen grande.
Chance G

Respuestas:

1

En su lugar, desea hook_field_formatter_prepare_view () . Tenga en cuenta que este enlace funciona en un grupo de entidades, no en una sola.

Aquí hay un fragmento de trabajo. Se necesita cierto array-fu para no terminar escribiendo un ciclo feo de diez líneas, ya que los deltas deben conservarse lineales.

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

hook_field_formatter_view()es donde su código genera la salida que se muestra al usuario, por lo que desea una matriz representable como valor de retorno. Así que solo procese la primera imagen dos veces y dele una clase de CSS diferente o algo así.

Algo como:

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

Dado que hook_field_formatter_view()espera una matriz renderizable, y dado que las matrices renderizables se marcan como renderizadas cuando se renderizan, simplemente hacer dos referencias al mismo objeto hará que se renderice una, se marque como renderizada y luego se ignore la próxima vez.

paul-m
fuente
Lo siento, Paul, pero ¿leíste mi pregunta? Pude agregarlo al comienzo de la matriz de elementos. El problema era que todavía no se estaba produciendo.
Chance G
hook_field_formatter_view () obtiene campos y debe convertirlos en matrices renderizables. Si solo hace dos referencias a la misma matriz, ese elemento se marcará como procesado y no se representará nuevamente. Por lo tanto, debe crear una nueva matriz renderizable para cada elemento que desee.
Paul-m
¿Es esta la respuesta?
Paul-m
No. Puedo agregar un elemento adicional a la matriz. Cuando dpm la matriz que muestra, simplemente no se imprime. Acepto todas las respuestas que son correctas.
Chance G
Como mencioné, el sistema de renderización marca los elementos como ya renderizados. Eso significa que si simplemente pasa una segunda imagen por referencia, se marcará como representada la primera vez, y luego NO se representará la segunda vez, ya que ya está marcada.
Paul-m