我们在此处编写的代码可以在此存储库中找到image_title_caption模块。但是,让我们看看我们如何达到最终结果。
>
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.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主题预处理程序进行预处理。因此,所有变量都是完全相同的,并且图像按通常的显示。
>
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>>它可以吗?
>现在我们已经编写了代码,我们需要启用模块并清除所有缓存,如果我们在启用后进行了代码更改。是时候测试了。
最后,您可以编辑文章,上传图像并指定标题。该标题将继续以这种方式行为,但此外,它将以标题显示在图像下方。当然,您仍然可以按照自己的意愿进行样式。
>结论
在本文中,我们看到了创建字段格式器并扩展drupal 8中的默认行为是多么容易。我们仅涉及此插件的覆盖效果(),但是我们可以做更多的事情来进一步自定义事物。您也不需要扩展图像形式。有很多现有的插件可以从示例中延伸或使用。> 此外,您还可以轻松地创建新的字段类型和小部件。这是一个类似的过程,但是您需要考虑一些架构信息,使用不同的注释类并编写更多代码。但是关键是您这样做非常灵活。
如何在Drupal 8中创建自定义字段格式化?首先,如果还没有一个自定义模块,则需要创建一个自定义模块。然后,在您的自定义模块中,在src/plugin/field/fieldformatter目录中创建一个新文件。该文件应根据其将要包含的类命名。在此文件中,您将定义您的自定义字段格式类别类,该类应扩展formatterbase类。您将需要实现多种方法,包括负责为字段值生成渲染数组的ViewElements()。
我如何将我的自定义字段格式化应用于Drupal 8?
如何控制Drupal 8中的自定义字段格式化的输出?由格式类别类别的ViewElement()方法控制。此方法应返回字段值的渲染数组。您可以使用Drupal的主题系统进一步自定义输出。
>如何在我的自定义字段格式化中为我的自定义field formatter创建一个在我的自定义字段formatter in In In In Drupal 8?>要为Drupal 8中的自定义字段格式化创建设置表单,您需要在格式类别中实现settingsform()和settingssummary()方法。 settingsform()方法应返回设置的表单阵列,并且settingssummary()方法应返回设置的摘要行的数组。
我如何使用自定义字段格式在drupal中显示图像8?>要使用自定义字段格式格式在Drupal 8中显示图像,您的格式化类别应扩展ImageFormatterBase类而不是FormatterBase。您将需要实现viewElements()方法来生成图像字段值的渲染数组。
我可以为Drupal 8?
以上是在Drupal 8中创建自定义字段格式的详细内容。更多信息请关注PHP中文网其他相关文章!