首頁 >後端開發 >php教程 >在Drupal 8中創建自定義字段格式

在Drupal 8中創建自定義字段格式

Jennifer Aniston
Jennifer Aniston原創
2025-02-18 08:42:11756瀏覽

在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