如何获取字段类型列表?


10

我正在将一个模块从Drupal 7移植到Drupal8。在该模块的配置设置中,我需要获取当前现有字段类型的列表。

在Drupal 7中,这是使用field_info_field_types()函数实现的。

在Drupal 8(8.0.0-rc3)中,尽管出现了Drupal API参考帮助页面中指出的信息,但仍然过时,但出现了“功能不存在”错误。

然后进行调查,我发现了DrupalContrib页面,该函数被声明为已弃用,并建议现在使用Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions()

但是使用它会引发另一个错误“未知服务plugin.manager.entity.field.field_type”,所幸与建议“您是说plugin.manager.field.field_type吗?”相关联

所以我尝试使用Drupal::service('plugin.manager.field.field_type')->getDefinitions()并哇:我得到了预期的字段类型数组。

但是,每个数组成员(一个字段类型)现在都是一个对象(而不是子数组),并且我要查找的数据嵌套在受保护的属性中,因此我无法访问它们。

在这个阶段,我被困住了。我认为它可能存在一些可以扩展以浏览这些数据的类,但是没有运气:我尤其无法弄清楚Drupal 8中的哪个组件是字段类型定义集中的组件。


最好查看api.drupal.org,这是更多更新。实际上,该功能没有页面
kiamlaluno

感谢您的提示“看看api.drupal.org”。另一方面(抱歉,这与元数据有关),如果我很容易理解您编辑了缩写(D7-> Drupal 7),我想知道为什么您在标题中删除了“ Drupal 8”?我倾向于认为会有一些规则说它是带有“ 8”标记的替换项。但是,作为读者,我经常发现标题比标签给我的确更可靠:在我看来,标签本质上是解决搜索过程的,而顺序阅读时我很少注意它们。
2015年

无需在标题中重复标签,因为无论列出了问题,这些标签始终可见。Stack Exchange用户注意标签。
kiamlaluno

Answers:


16

第一级是一个数组。密钥是插件ID。您可以列出它们:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

结果如下:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

您可以选择一个并转储插件定义。

var_dump($defs['comment']);

如果您对特殊对象感兴趣,可以在api.drupal.org的帮助下更深入地挖掘。但是,如果您在核心目录中搜索插件,它将更加容易。

要访问对象,请在var_dump中找到它并使用一种方法:

$defs['comment']['description']->render();

在这种情况下,是对象TranslatableMarkup,它具有render方法来访问已转换的字符串。


谢谢,但这是我已经做了的。除此之外,我的问题仍然存在:如何以编程方式访问这些对象中的数据
cFreed

您想在字段定义中找到什么?通常,您可以在api中查找对象的属性和方法,然后使用`->'访问它们。字段定义更易于在源代码中查找。
2015年

我提取了labeldescriptionmodule以配置形式显示它们,用户可以在其中检查它想要的模块,我的模块(MMS)为相关字段创建克隆的令牌。
cFreed

我添加一个例子。
2015年

糟糕!我看到了您的最后评论,但没有注意到您的编辑,因此我一直在等待。我会尝试你的建议。谢谢。
2015年

4

现在,通过t()传递的每个字符串都是一个对象。您可以将它们作为字符串访问,实际上,您应该这样做。

在极少数情况下,您不能按原样使用这样的对象,例如数组键,对于这些,您需要将它们转换为字符串。其他任何事情都应该起作用。

PS:官方API文档是http://api.drupal.org/api/drupal/8。将其用作核心。

另一个好的资源是变更记录:https : //www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D=&created%5Bmax% 5D =

编辑:回应您的评论,我不太理解您的意思。您需要的所有信息就在这里,只需使用它即可。

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

同样,只需忽略标签/描述是对象。它们具有__toString()方法,当您打印/使用它们时会自动调用它们。


感谢您的回答。您最后建议的链接看起来很有希望,我将根据此信息进行调查。简要说,我错了,如果我想,我的需要(提取labeldescriptionmodule每个字段类型的字符串)我应该:1)从获取列表Drupal::service('plugin.manager.field.field_type')->getDefinitions()就像已经完成; 2)然后使用返回数组的每个键(字段类型名称)调用特定类(查找哪个类,在哪里,我必须更深入地研究),该类将提供获取所需信息的方法?TIA具有这种精度。
cFreed

更新了我的答案。
贝尔迪尔,2015年

糟糕...不明白!您在编辑中提出的建议仅仅是我在D7中所做的。而且它在D8中不起作用,因为$definition它不是D8中的字符串数组,而是对象的数组!我使用dpm()进行了检查,发现每个所需的字符串都以这种方式嵌套:'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...)。我是否缺少明显的东西?
cFreed

刚刚发现(最新)4k4的最后编辑,该方法有效。实际上,对我来说,问题是要知道在哪里可以找到TranslatableMarkup该类,以及该render()方法的可用性。最后,获取我的数据的正确方法是print $definition['label']->render();。不过,感谢您的其他信息。
cFreed

不,同样,你也不会需要- >渲染()。使用$ definition ['label'],它可以正常工作,相信我:)
Berdir

1

@Berdir答案的更新版本。在外壳中使用。

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

在这里输出:https : //gist.github.com/sobi3ch/70635cc62defff606242


1

Google在搜寻这些内容时似乎找到了这个问题

如果您使用的是Drupal Console,则还可以使用:

drupal plugin:debug field.field_type

Drupal.org上也有此功能,它也可以帮助:

定义和使用内容实体字段定义

虽然很难找到可用的例子

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.