我們在此處編寫的代碼可以在此存儲庫中找到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中文網其他相關文章!