如何为实体属性实现字段格式化程序


16

我使用Entity API创建了一个自定义实体,实体具有hook_schema()entityPropertyInfo()扩展类中定义和声明的某些属性EntityDefaultMetadataController

到目前为止,一切都很好。

现在,我希望用户能够自定义在查看实体时是否以及如何显示这些属性,因此我实现了hook_field_extra_fields()并对其进行了声明。

然后,在我的控制器延伸EntityAPIController我添加的属性在$内容数组buildContent()作为,概述这里

它实际上工作得很好,并且呈现了属性并遵守“管理显示”中的顺序和可见性设置。

但是,我似乎无法弄清楚如何在“管理显示”中添加设置以自定义标签位置(inline/above/hidden),更重要的是,如何为这些属性指定自定义格式器。

有什么线索吗?


1
属性甚至支持格式化程序吗?由于“节点”在“管理显示”下没有“标题”,因此我的第一个猜测是不会。+1是个好问题。
Letharion

实体属性不支持格式化程序,不。您需要自己实现整个机制
Clive

我担心情况就是如此
Alex Weber

Answers:


7

您可以创建一个提供“ property”字段类型的模块。将要格式化的属性存储为实例设置,然后对其应用格式化程序。它应该相对简单。关系模块有一个虚拟字段模块,它可以帮助您弄清楚如何对此进行编码。


1
实体属性字段模块是这种方法的另一个起点。
andrewmacpherson

1

如您field_ui_display_overview_formmodules/field_ui/field_ui.admin.inc页面中所见,Display setting将以$instances和填充$extra_fields

$instances = field_info_instances($entity_type, $bundle);
$field_types = field_info_field_types();
$extra_fields = field_info_extra_fields($entity_type, $bundle, 'display');

在此函数中,有两个创建页面的循环:

foreach ($instances as $name => $instance) {
   ...
}

foreach ($extra_fields as $name => $extra_field) {
   ...
}

并且只有在第一个循环中循环访问的字段中才有label和的选项formatter

因此,如果要在属性上使用此功能(如@Clive所说):

您需要自己实现整个机制

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.