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

在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><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></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
解释负载平衡如何影响会话管理以及如何解决。解释负载平衡如何影响会话管理以及如何解决。Apr 29, 2025 am 12:42 AM

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

说明会话锁定的概念。说明会话锁定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP会议的选择吗?有其他PHP会议的选择吗?Apr 29, 2025 am 12:36 AM

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

在PHP的上下文中定义'会话劫持”一词。在PHP的上下文中定义'会话劫持”一词。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什么?PHP的完整形式是什么?Apr 28, 2025 pm 04:58 PM

文章讨论了PHP,详细介绍了其完整形式,在We​​b开发中的主要用途,与Python和Java的比较以及对初学者的学习便利性。

PHP如何处理形式数据?PHP如何处理形式数据?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _获取超级全局的php处理数据,并通过验证,消毒和安全数据库交互确保安全性。

PHP和ASP.NET有什么区别?PHP和ASP.NET有什么区别?Apr 28, 2025 pm 04:56 PM

本文比较了PHP和ASP.NET,重点是它们对大规模Web应用程序,性能差异和安全功能的适用性。两者对于大型项目都是可行的,但是PHP是开源和无关的,而ASP.NET,

PHP是对病例敏感的语言吗?PHP是对病例敏感的语言吗?Apr 28, 2025 pm 04:55 PM

PHP的情况敏感性各不相同:功能不敏感,而变量和类是敏感的。最佳实践包括一致的命名和使用对案例不敏感的功能进行比较。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。