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

问题描述 投票:0回答:1

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

除了“Hello World”之外,我决定敢于做一些“复杂”的事情,但我仍然坚持我将如何实现这一目标。

这是我到目前为止:

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

我假设我需要“挂钩”某个地方,从数据库中返回人员列表。然后我遍历数据,获取生日,计算年龄,将结果(年龄)粘贴回数据,然后页面/视图将以某种方式显示。

当然我已经被困在如何做到这一点?我需要在哪里挂钩?用什么API?然后,当然,我已经创建了一个视图,但视图没有“年龄”字段 - 因为这是动态计算的。那么我将在何处以及如何展示它?

这么多的问题...

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

谢谢你的一些提示!

drupal-8
1个回答
0
投票

without custom programming

实际上,您可以在没有自定义编码的情为此,您可以使用以下任一模块field_token_valuecomputed_field

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

from your custom theme

最简单的方法是在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

在那里,您可以包含刚刚在proprocess中创建的变量。

person age: {{ person_age }}

确保清除缓存以便Drupal看到所有这些更改。

更多信息

要找出要覆盖的树枝模板,请参阅here有关twig and getting available variables的更多信息通过在以前的链接上启用调试模式,也可以获得有关使用哪个树枝模板的更多信息。

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

© www.soinside.com 2019 - 2024. All rights reserved.