搜尋
首頁後端開發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
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)