Drupal 8:正确呈现自定义实体及其自定义字段的方法吗?

时间:2016-04-01 13:08:01

标签: drupal drupal-8 custom-field-type

在我的模块中,我有一个自定义实体LocationEntity,它使用自定义字段类型CoordinateItem,其中包含2个子字段XY

那么Drupal 8的正确方法是什么:

1)在树枝模板中渲染此LocationEntity

  • 我正在做的只是将实体发送到twig模板'#loc1'并使用getter方法{{ loc1.getName() }}手动呈现其每个字段值。它有效,但我确定这不是正确的做法。

2)如果问题1有另一种正确的方法,那么如何使用多个模板来渲染实体?

  • 例如,一个包含较少字段的简单布局和一个包含所有字段的详细布局。

3)在实体中,我定义了使用自定义字段CoordinateItem。但是现在该如何处理它的getter和setter,因为它不是一个单独的子字段?

  • Getter if $this->get('coord') - >一个FieldItemList对象。
  • Getter if $this->get('coord')->value - > null
  • 设置器?参数是什么类型的?

3)我为CoordinateItem编写了一个格式化程序来显示其子字段。但我又不知道如何使用此格式化程序在主(实体)模板中呈现此自定义字段?

  • 也许这与问题1和2有关?

1 个答案:

答案 0 :(得分:2)

您应该使用字段格式来呈现字段。这使得可以配置每个字段的呈现方式。对于基本字段和配置字段都是一样的。

如果您有自定义实体,则需要在预处理功能中自行完成。您可以将节点模块作为示例:

function template_preprocess_node(&$variables) {
  ...
  // Helpful $content variable for templates.
  $variables += array('content' => array());
  foreach (Element::children($variables['elements']) as $key) {
    $variables['content'][$key] = $variables['elements'][$key];
  }
  ...
}

这基本上可以在模板中执行{{ content }},然后渲染所有字段。

这是最佳实践,是呈现实体的最灵活,最简单的方法,因为您只需使用已经存在的字段格式化程序。