Gancho para duplicação de campo

15

Eu tenho um módulo personalizado que está formatando a exibição de um campo de imagem, que pode aceitar vários valores. Gostaria de saber qual gancho devo usar para duplicar o primeiro valor do campo (por exemplo, "[imagem1]") e adicioná-lo de volta ao início da matriz ( array_unshift()acho que) antes que o restante de minhas funções formate o exibição / tema do campo.

Então o que foi

  • [imagem1]
  • [imagem2]
  • [imagem3]

torna-se

  • [imagem1]
  • [imagem1]
  • [imagem2]
  • [imagem3]

Vou então descrevê-los separadamente, mas acho que já tenho essa parte.

Atualmente hook_field_formatter_view(), estou usando e tentei adicioná-lo ao início da $itemsmatriz na parte superior da função, mas isso não pareceu funcionar. Se eu imediatamente mostrar dprint_r()o $itemsarray depois disso, mas apenas 3 itens serão exibidos; Estou assumindo que o número de campos seja determinado em outro lugar.

Chance G
fonte
11
Se você deseja apenas copiar a imagem, talvez o Javascript seja o caminho?
Cód:
Não me desculpe. Estou usando js nos resultados, mas preciso fazer outras coisas nos dados com o hook_field_formatter_viewmas ele é executado apenas uma vez por imagem.
Chance G
Eu olhei para ele em um depurador e fiquei surpreso ao encontrar deltas extras adicionados à matriz sendo ignorados.
Adam S
+1 na sua pergunta, é um tópico interessante. Mas, para nos ajudar a pensar na solução real, você pode ser mais específico qual é o seu principal objetivo (então, o motivo pelo qual deseja que a primeira imagem seja duplicada)? Quanto mais informações soubermos, melhores respostas você poderá obter. :)
Sk8erPeter
Acabei resolvendo esse problema com javascript. Mas para responder sua pergunta; Eu estava tentando implementar o hoverzoom, que usa uma imagem grande por conjunto e, em seguida, miniaturas de todas as imagens para permitir que o usuário alterne a imagem grande.
Possibilidade G

Respostas:

1

Você deseja que hook_field_formatter_prepare_view () . Observe que esse gancho opera em um grupo de entidades, não em um único.

Aqui está um trecho de trabalho. É necessário algum array-fu para não acabar escrevendo um loop feio de dez linhas, pois os deltas devem ser preservados lineares.

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

hook_field_formatter_view()é onde seu código produz a saída mostrada ao usuário e, portanto, deseja uma matriz renderizável como valor de retorno. Portanto, apenas processe a primeira imagem duas vezes e forneça uma classe css diferente ou algo assim.

Algo como:

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

Como hook_field_formatter_view()espera uma matriz renderizável e como matrizes renderizáveis ​​são marcadas como renderizadas quando renderizadas, simplesmente fazer duas referências ao mesmo objeto fará com que uma seja renderizada, marcada como renderizada e, posteriormente, ignorada na próxima vez.

paul-m
fonte
Sinto muito Paul, mas você leu minha pergunta? Consegui adicioná-lo ao início da matriz de itens. A questão era que ele ainda não estava sendo produzido.
Chance G
hook_field_formatter_view () obtém campos e você deve transformá-los em matrizes renderizáveis. Se você apenas fizer duas referências à mesma matriz, esse item será marcado como renderizado e não renderizado novamente. Então você deve criar uma nova matriz renderizável para cada item que desejar.
paul-m
Essa é a resposta?
paul-m
Não. Consigo adicionar um item extra à matriz. Quando eu dpm a matriz exibida, ela simplesmente não é impressa. Eu aceito todas as respostas que estão corretas.
Chance G
Como mencionei, o sistema de renderização marca os itens como já renderizados. Isso significa que, se você simplesmente passar uma segunda imagem por referência, ela será marcada como renderizada na primeira vez e, em seguida, NÃO renderizada na segunda vez, pois já está marcada.
paul-m