如何创建自定义模块以在已存在的页面/视图上显示计算值?

时间:2019-02-19 01:01:28

标签: drupal-8

尝试从Drupal 8上的自定义模块开发开始。没有以前的Drupal开发背景。在过去两周左右的时间内一直在阅读和观看一些材料。

我决定不敢做比“ Hello World”更多的“复杂”事情,但是我对如何真正地解决这个问题感到困惑。

这是我到目前为止所拥有的:

  1. 我为“人”创建了内容类型。非常简单,它只包含该人的姓名和生日(仅日期),因此您可以使用该表格输入几个人。
  2. 我创建了一个视图,该视图显示人员列表,他们的姓名和出生日期。当然,到目前为止,所有内容都在使用核心管理功能。
  3. 现在,我想创建一个自定义模块来计算人员的年龄(基于数据库中存储的日期)。它需要今天的日期,减去该人的生日,然后计算其年龄。
  4. 然后,通过一些魔术,将年龄返回到渲染/页面输出,现在,此计算出的值(年龄)将与人的姓名和生日一起显示在视图上。

我假设我需要“挂接到”某个地方,那里的人的名单是从数据库中返回的。然后,我遍历数据,获取生日,计算年龄,将结果(年龄)重新粘贴到数据中,然后页面/视图将以某种方式显示。

我当然已经对如何执行此操作感到困惑?我需要挂在哪里?用什么API?然后,当然,我已经创建了一个视图,但是该视图没有“ age”字段-因为该字段是即时计算的。那我在哪里显示呢?

这么多问题...

如果有人会知道与此类似的一些教程,我将不胜感激。从Drupal的“自定义”方面开始很难。

感谢一些提示!

1 个答案:

答案 0 :(得分:0)

无需自定义编程

您实际上可以执行此操作而无需自定义编码。为此,您可以使用以下任一模块field_token_valuecomputed_field

它们都创建了一个字段,而没有给用户提供输入任何值的文本框。 这些字段的值是根据每个字段定义的预定义规则/自定义编码/令牌计算的。

来自您的自定义主题

最简单的方法是在theming层上执行此操作,而不将此值存储在数据库中。您必须在hook_preprocess_node

中使用THEMENAME.theme
function THEMENAME_preprocess_node(&$variables){
  //install debug and kint to be able to use
  //kint($variables);

  $node = $variables["node"];

  if($node->getType() == "CONTENTTYPE" && $node->hasField('field_date')){

    //get date value something like "2018-09-07T21:35:30"
    $date = $node->field_date->value;

    //your logic and age calculations
    // ...
    $age = 35;

    //set variable to use in node.html.twig based templates
    $variables["person_age"] = $age;
  }
}

为了获得有关可用功能的更多信息,请安装调试模块并使kint(调试的一部分)能够使用kint函数查看变量

node.html.twig从您的自定义主题(或父主题或经典的核心主题)复制到您的THEMENAME/templates文件夹中,并将其重命名为node--CONTENTTYPE.html.twig

您可以在其中包含您刚刚在过程中创建的变量。

person age: {{ person_age }}

请确保您清除了缓存,以使Drupal能够看到所有这些更改。

更多信息

要了解要覆盖哪些树枝模板,请参见here 有关twig and getting available variables的更多信息 也可以通过在先前的链接上启用调试模式来获取有关使用哪个树枝模板的更多信息。

我建议您拿起一本有关Drupal开发的书,以更具体的方式理解所有这些概念。