Crochet pour la duplication sur le terrain

15

J'ai un module personnalisé qui met en forme l'affichage d'un champ d'image, qui peut accepter plusieurs valeurs. Je voudrais savoir quel hook je dois utiliser pour dupliquer la première valeur du champ (par exemple "[image1]"), et l'ajouter au début du tableau (avec array_unshift()je suppose) avant que le reste de mes fonctions formate le affichage / thème du terrain.

Alors, quel était

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

devient

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

Je vais ensuite les thème séparément, mais je pense que j'ai déjà compris cette partie.

J'utilise actuellement hook_field_formatter_view(), et j'ai essayé de l'ajouter au début du $itemstableau en haut de la fonction, mais cela ne semble pas fonctionner. Si j'ai immédiatement dprint_r()le $itemstableau après cela, il montre, mais seulement 3 éléments obtiennent une sortie; Je suppose que le nombre de champs est déterminé ailleurs.

Chance G
la source
1
Si vous voulez simplement copier l'image, peut-être que Javascript est le chemin?
Codium
Non je suis désolé. J'utilise js sur les résultats mais j'ai besoin de faire d'autres choses avec les données avec hook_field_formatter_viewmais ça ne fonctionne qu'une fois par image.
Chance G
Je l'ai regardé dans un débogueur et j'ai été surpris de trouver des deltas supplémentaires ajoutés au tableau ignorés.
Adam S
+1 pour votre question, c'est un sujet intéressant. Mais pour nous aider à réfléchir à la vraie solution, pouvez-vous être plus précis quel est votre objectif principal (donc la raison pour laquelle vous voulez que la première image soit dupliquée)? Le plus d'informations que nous connaissons, les meilleures réponses que vous pourriez obtenir. :)
Sk8erPeter
J'ai fini par résoudre ce problème avec javascript. Mais pour répondre à votre question; J'essayais d'implémenter hoverzoom, qui utilise une grande image par ensemble, puis des miniatures de toutes les images pour permettre à l'utilisateur de changer la grande image.
Chance G

Réponses:

1

Vous voulez plutôt hook_field_formatter_prepare_view () . Notez que ce hook fonctionne sur un groupe d'entités, pas sur une seule.

Voici un extrait de travail. Un tableau-fu est nécessaire pour ne pas finir par écrire une boucle laide de dix lignes, car les deltas doivent être conservés linéairement.

<?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
la source
0

hook_field_formatter_view()est l'endroit où votre code fait la sortie qui est montrée à l'utilisateur, et donc il veut un tableau pouvant être rendu comme valeur de retour. Il suffit donc de traiter la première image deux fois et de lui donner une classe CSS différente ou quelque chose.

Quelque chose comme:

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

Étant donné qu'il hook_field_formatter_view()attend un tableau pouvant être rendu et que les tableaux pouvant être rendus sont marqués comme rendus lorsqu'ils sont rendus, le simple fait de faire deux références au même objet entraînera le rendu d'une, la marque comme rendu, puis sera ignorée la prochaine fois.

paul-m
la source
Je suis désolé Paul mais as-tu lu ma question? J'ai pu l'ajouter au début du tableau des éléments. Le problème était qu'il n'était toujours pas produit.
Chance G
hook_field_formatter_view () obtient les champs et vous devez les transformer en tableaux rendables. Si vous faites simplement deux références au même tableau, cet élément sera marqué comme rendu et ne sera plus rendu. Vous devez donc créer un nouveau tableau de rendu pour chaque élément souhaité.
paul-m
Est-ce la réponse?
paul-m
Non. Je peux ajouter un élément supplémentaire au tableau. Lorsque je dpm le tableau qu'il affiche, il ne s'imprime pas. J'accepte toutes les réponses correctes.
Chance G
Comme je l'ai mentionné, le système de rendu marque les éléments comme déjà rendus. Cela signifie que si vous passez simplement une deuxième image par référence, elle sera marquée comme rendue la première fois, puis NON rendue la deuxième fois, car elle est déjà marquée.
paul-m