首页 >后端开发 >php教程 >在Drupal 8中创建自定义字段格式

在Drupal 8中创建自定义字段格式

Jennifer Aniston
Jennifer Aniston原创
2025-02-18 08:42:11762浏览

在Drupal 8中创建自定义字段格式

钥匙要点

  • 在Drupal 8中创建自定义字段格式化格式涉及定义自定义模块的SRC/plugin/field/fieldformatter目录中的新格式化类别,并从默认的ImageFormatter插件延伸。
  • 新的格式类别应该覆盖返回字段数据渲染数组的ViewElements()方法,用自定义替换默认的Image_Formatter主题。 在模块的.module文件中创建了一个新主题,image_title_caption_formatter,与默认image_formatter主题中的相同变量传递。
  • 可以通过内容类型的“管理显示”选项卡应用自定义字段格式化器,从“格式”下拉下拉下拉下拉列表中的“管理显示”选项卡中。
  • >请注意,由于开发过程Drupal 8在撰写本文时已经进行了,因此代码的某些部分可能已经过时。查看此存储库,我尝试更新示例代码并使其与最新的Drupal 8版本一起使用。
  • >
  • >随着带注释的插件的引入,在Drupal 8中发生了很多变化。我们有一种更简化的方法来描述和发现扩展核心的功能。与许多其他组件一起,以前的字段API(较大和合并的实体API的一部分)现在基于插件。
在本教程中,我们将通过为现有字段定义自定义字段格式(图像)。我们想要实现的是使显示图像下面的图像在其下方。如果存在,则该标题将是分配给图像的标题值。

我们在此处编写的代码可以在此存储库中找到image_title_caption模块。但是,让我们看看我们如何达到最终结果。

> 在Drupal 8中创建自定义字段格式drupal模块

>让我们首先创建一个新的自定义模块(image_title_caption),只有一个文件:

image_title_caption.info.yml:

>这里没有什么与众不同的。如果需要,我们甚至可以启用模块。

插件

在Drupal 8中

>,字段格式(例如字段类型和小部件本身)是插件。核心模块定义了核心模块,也可以在Drupalcorefieldpluginfieldfieldformatter名称空间内找到。就像我们在上一篇文章中看到的那样,我们查看了自定义块,插件也位于模块的SRC/插件/文件夹中。对于字段格式,这将是SRC/Plugin/field/fieldformatter目录。

name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image
>您可以看到我们自己的格式化类别:

> src/plugin/field/fieldformatter/imageTitleCaption.php:

name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image

这是我们的插件。别无其他。在类声明上方,我们有@fieldformatter的注释,可以通过该注释找到插件。我们指定插件ID(image_title_caption),标签和一系列字段类型,可以与此格式使用。在我们的情况下,后者仅包含默认图像字段类型,但是如果愿意,我们可以支持更多的自定义字段类型。该数组中的值是插件ID,因此,如果您查看图像字段类型插件,您会发现其ID是Image。

类看起来很简单,因为我们正在从核心图像模块定义的默认ImageFormatter插件延伸。出于我们的目的,我们需要覆盖的只是负责返回字段数据渲染数组的ViewElements()方法。后者可以在$项目列表中找到,可以用于渲染和准备。

>我们在此方法中要做的第一件事是确保我们在项目上调用父类方法并将其存储在变量中。这已经准备好将图像呈现,就像通常一样。

默认情况下,ImageFormatter插件(父)在渲染数组中使用image_formatter主题来输出图像字段值。我们在这里做的是,对于每个项目,我们用自己的主题替换此主题:image_title_caption_formatter。然后,我们像父母一样返回元素(渲染数组)。

>您会在Drupal 8中注意到很多:我们可以很好地指出我们需要扩展的父级课程需要做什么。而且,如果您问我,这比弄清楚某些魔术钩或功能的功能要好得多。

主题

>由于我们在上面指定的image_title_caption_formatter主题到目前为止是虚构的,因此我们需要创建它。在我们模块的.Module文件中,我们需要实现hook_theme:

image_title_caption.module:

>这看起来应该熟悉,因为它与Drupal 7非常相似。请注意我们传递给此主题的变量。我们打算覆盖默认的image_formatter主题,因此我们也应该在此处传递相同的变量。此外,由于对Image_formatter主题进行了预处理,因此我们还需要为我们的主题创建一个预处理程序:
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file
</span></span></span><span><span> * Contains \Drupal\image_title_caption\Plugin\Field\FieldFormatter\ImageTitleCaption.
</span></span><span><span> */
</span></span><span>
</span><span><span>namespace Drupal<span>\image_title_caption\Plugin\Field\FieldFormatter</span>;
</span></span><span>
</span><span><span>use Drupal<span>\Core\Field\FieldItemListInterface</span>;
</span></span><span><span>use Drupal<span>\image\Plugin\Field\FieldFormatter\ImageFormatter</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Plugin implementation of the 'image_title_caption' formatter.
</span></span><span><span> *
</span></span><span><span> * @FieldFormatter(
</span></span><span><span> *   id = "image_title_caption",
</span></span><span><span> *   label = @Translation("Image with caption from title"),
</span></span><span><span> *   field_types = <span>{
</span></span></span><span><span> *     "image"
</span></span><span><span> *   <span>}
</span></span></span><span><span> * )
</span></span><span><span> */
</span></span><span><span>class ImageTitleCaption extends ImageFormatter {
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function viewElements(FieldItemListInterface $items) {
</span></span><span>    <span>$elements = <span>parent::</span>viewElements($items);
</span></span><span>    <span>foreach ($elements as &$element) {
</span></span><span>      <span>$element['#theme'] = 'image_title_caption_formatter';
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $elements;
</span></span><span>  <span>}
</span></span><span>
</span><span><span>}</span></span>

在此预处理器中,我们执行两个动作:
<span>/**
</span><span> * Implements hook_theme().
</span><span> */
</span><span>function image_title_caption_theme() {
</span>  <span>return array(
</span>    <span>'image_title_caption_formatter' => array(
</span>      <span>'variables' => array('item' => NULL, 'item_attributes' => NULL, 'url' => NULL, 'image_style' => NULL),
</span>    <span>),
</span>  <span>);
</span><span>}</span>

>我们确保将传递给模板文件的变量首先由默认的Image_Formatter主题预处理程序进行预处理。因此,所有变量都是完全相同的,并且图像按通常的显示。
    我们创建了一个称为字幕的新变量,该变量将包含图像标题的消毒值。
  • 用于固定化,我们在静态上使用辅助弦类。我们仍在.module文件内部,因此我们不能注入它,但是我们需要
  • >使用
>在文件的顶部:

>

name: Image title caption
type: module
description: Uses the image title field as a caption
core: 8.x
dependencies:
  - image

模板

最后,我们需要为我们的新主题创建一个模板文件:>

>模板/图像标准caption-formatter.html.twig:

与Drupal 7相似,该文件的名称很重要,因为它反映了主题名称。至于内容,它们几乎与image_formatter主题使用的模板相同,除了打印在底部的字幕。

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file
</span></span></span><span><span> * Contains \Drupal\image_title_caption\Plugin\Field\FieldFormatter\ImageTitleCaption.
</span></span><span><span> */
</span></span><span>
</span><span><span>namespace Drupal<span>\image_title_caption\Plugin\Field\FieldFormatter</span>;
</span></span><span>
</span><span><span>use Drupal<span>\Core\Field\FieldItemListInterface</span>;
</span></span><span><span>use Drupal<span>\image\Plugin\Field\FieldFormatter\ImageFormatter</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * Plugin implementation of the 'image_title_caption' formatter.
</span></span><span><span> *
</span></span><span><span> * @FieldFormatter(
</span></span><span><span> *   id = "image_title_caption",
</span></span><span><span> *   label = @Translation("Image with caption from title"),
</span></span><span><span> *   field_types = <span>{
</span></span></span><span><span> *     "image"
</span></span><span><span> *   <span>}
</span></span></span><span><span> * )
</span></span><span><span> */
</span></span><span><span>class ImageTitleCaption extends ImageFormatter {
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function viewElements(FieldItemListInterface $items) {
</span></span><span>    <span>$elements = <span>parent::</span>viewElements($items);
</span></span><span>    <span>foreach ($elements as &$element) {
</span></span><span>      <span>$element['#theme'] = 'image_title_caption_formatter';
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $elements;
</span></span><span>  <span>}
</span></span><span>
</span><span><span>}</span></span>
>它可以吗?

>现在我们已经编写了代码,我们需要启用模块并清除所有缓存,如果我们在启用后进行了代码更改。是时候测试了。

>例如,转到admin/struction/type/manage/acrate/display的文章内容类型字段显示设置。对于图像字段,在格式标题下,您应该能够从标题格式中选择带有标题的图像。保存表单,然后转到admin/struction/type/manage/acrate/fields/node.field_image,并确保启用图像字段标题。

最后,您可以编辑文章,上传图像并指定标题。该标题将继续以这种方式行为,但此外,它将以标题显示在图像下方。当然,您仍然可以按照自己的意愿进行样式。

>

结论

在本文中,我们看到了创建字段格式器并扩展drupal 8中的默认行为是多么容易。我们仅涉及此插件的覆盖效果(),但是我们可以做更多的事情来进一步自定义事物。您也不需要扩展图像形式。有很多现有的插件可以从示例中延伸或使用。

> 此外,您还可以轻松地创建新的字段类型和小部件。这是一个类似的过程,但是您需要考虑一些架构信息,使用不同的注释类并编写更多代码。但是关键是您这样做非常灵活。

在Drupal 8

中创建自定义字段格式化的经常询问的问题

如何在Drupal 8中创建自定义字段格式化?首先,如果还没有一个自定义模块,则需要创建一个自定义模块。然后,在您的自定义模块中,在src/plugin/field/fieldformatter目录中创建一个新文件。该文件应根据其将要包含的类命名。在此文件中,您将定义您的自定义字段格式类别类,该类应扩展formatterbase类。您将需要实现多种方法,包括负责为字段值生成渲染数组的ViewElements()。

>在Drupal 8中@FieldFormatter注释的目的是什么?它包括诸如ID,标签和field_types之类的属性。 ID是用于格式化器的唯一标识符,标签是人类可读名称,而field_types是格式化器支持的字段类型计算机名称的数组。

我如何将我的自定义字段格式化应用于Drupal 8?

>在Drupal 8中将您的自定义字段格式化应用于字段,您需要转到内容类型,分类学术语或其他具有具有该类型的实体类型的“管理显示”选项卡场地。在列表中找到字段,然后从“格式”下拉列表中选择您的自定义格式化器。然后单击“更新”按钮并保存更改。

>

如何控制Drupal 8中的自定义字段格式化的输出?由格式类别类别的ViewElement()方法控制。此方法应返回字段值的渲染数组。您可以使用Drupal的主题系统进一步自定义输出。

>

>我可以在Drupal 8?

中使用自定义字段格式用于多个字段类型drupal 8。中的字段类型。在格式化类的@fieldformatter注释中,您可以在field_types属性中指定字段类型的机器名称的数组。

如何在我的自定义字段格式化中为我的自定义field formatter创建一个在我的自定义字段formatter in In In In Drupal 8?

>要为Drupal 8中的自定义字段格式化创建设置表单,您需要在格式类别中实现settingsform()和settingssummary()方法。 settingsform()方法应返回设置的表单阵列,并且settingssummary()方法应返回设置的摘要行的数组。

我如何使用自定义字段格式在drupal中显示图像8?

>要使用自定义字段格式格式在Drupal 8中显示图像,您的格式化类别应扩展ImageFormatterBase类而不是FormatterBase。您将需要实现viewElements()方法来生成图像字段值的渲染数组。

我可以为Drupal 8?

的自定义字段类型创建自定义字段formatter ,您可以为Drupal 8中的自定义字段类型创建自定义字段格式。我可以使用自定义字段格式格式在Drupal 8中显示链接?您需要实现viewElements()方法来生成链接字段值的渲染数组。

>如何为Drupal 8中的多值字段创建自定义字段格式化?类并实现ViewElements()方法。该方法应考虑到该字段可能具有多个值的字段值返回渲染数组。

以上是在Drupal 8中创建自定义字段格式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn