钩为字段重复


15

我有一个自定义模块,用于格式化图像字段的显示,可以接受多个值。我想知道我应该使用哪个钩子来复制字段的第一个值(例如“ [image1]”),并将其添加回数组的开头(据array_unshift()我估计),然后其余函数格式化显示/主题。

那是什么

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

变成

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

然后,我将分别对它们进行主题设置,但是我想我已经弄清楚了这一部分。

我目前正在使用hook_field_formatter_view(),并且试图将其添加到$items函数顶部的数组开头,但这似乎没有用。如果在此之后立即dprint_r()显示$items数组,则仅输出3个项目;我假设字段的数量在其他地方确定。


1
如果您只想复制图像,也许可以使用Javascript?
刺松

不,我很抱歉。我在结果上使用js,但我需要对数据进行其他处理,hook_field_formatter_view但每个图像只能运行一次。
机会G

我在调试器中查看了它,并惊讶地发现添加到被忽略的数组的额外增量。
亚当S

为您的问题+1,这是一个有趣的话题。但是为了帮助我们考虑真正的解决方案,您能否更具体地说明主要目的是什么(因此,您要复制第一张图像的原因)?我们知道的信息越多,您可以获得的答案就越好。:)
Sk8erPeter

我最终用javascript解决了这个问题。但是要回答你的问题;我试图实现hoverzoom,该方法每组使用一个大图像,然后使用所有图像的缩略图来允许用户切换大图像。
机会G

Answers:


1

您需要hook_field_formatter_prepare_view()。请注意,此挂钩对一组实体进行操作,而不是对单个实体进行操作。

这是一个工作片段。因为必须将增量保持线性,所以需要一些数组赋值以免最终写出十行丑陋的循环。

<?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()是您的代码将输出显示给用户的地方,因此它需要可渲染的数组作为返回值。因此,只需将第一张图片处理两次,然后为其提供不同的CSS类或其他内容。

就像是:

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

由于hook_field_formatter_view()期望可渲染数组,并且由于可渲染数组在渲染时被标记为已渲染,因此仅对同一个对象进行两次引用将导致一个对象被渲染,标记为已渲染,然后在下一次忽略。


保罗,对不起,您读了我的问题吗?我能够将其添加到items数组的开头。问题在于它仍未输出。
机会G

hook_field_formatter_view()获取字段,您必须将它们变成可渲染的数组。如果仅对同一数组进行两个引用,则该项目将被标记为已渲染,并且不会再次渲染。因此,您必须为所需的每个项目创建一个新的可渲染数组。
paul-m

这是答案吗?
paul-m

不,我能够向阵列添加一个额外的项目。当我dpm显示它显示的数组时,它只是不打印。我接受所有正确答案。
Chance G

如前所述,渲染系统将项目标记为已渲染。这意味着,如果您仅通过引用传递第二张图像,则由于它已被标记,因此它将被标记为第一次渲染,然后第二次不渲染。
paul-m
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.