drupal obsah

Tutoriál: Vlastní typ obsahu s vlastními poli pro modul do Drupalu

drupal obsah

Tutoriál: Vlastní typ obsahu s vlastními poli pro modul do Drupalu

Jak jsem přišel k této myšlence? Vyvíjel jsem modul, který stahuje obsah ze vzdálené API a ukládá jej jako obsah do Drupalu. Musel jsem se při tom držet stanovené struktury dat, a proto jsem si musel vytvořit vlastní typ obsahu.

 

Přestože tvorba vlastního typu obsahu je dokumentována v oficiální Drupal dokumentaci, chybí v ní mnohé vysvětlení některých nastavení a je postavena pouze na jednom specifickém příkladu. Rozhodl jsem se proto sepsat svá zjištění z různých pokusů a také informace, které jsem posbíral z různých návodů, videí, dokumentací, webstránek atd., Kde byly tyto informace roztroušeny.

Jak začít?

Jako první je třeba vytvořit modul. Jelikož typ obsahu bude nainstalován s modulem, všechny projektové Yamli konfigurační soubory musí být umístěny do „my_module/config/install“, kde „my_module“ je identifikátor modulu. Obsah je reprezentován v kódu jako "node". Pro jednoduchost jsem použil do tohoto příkladu název typu obsahu "foo".

 

1 soubor je potřebný jako hlavní konfigurační soubor, 2 nové soubory a 2 upravené soubory jsou potřebné pro každé nové pole. Jen správná konfigurace garantuje, že všechno bude korektně nainstalovány odinstalované spolu s modulem. Pokud nebude dodržena, vyskytnou se problémy při opětovné instalaci.

 

Hlavní konfigurační soubor (node.type.foo.yml)


langcode: en
dependencies:
  enforced:
    module:
    - my_module
name: 'Foo'
type: foo
description: 'Test content type description.'
help: 'Test help text.'
new_revision: false
preview_mode: 2

 

Tento soubor popisuje typ obsahu. Seznam „dependencies/enforced/module“ propojuje typ obsahu a modul a tím zajišťuje korektní instalaci/odinstalaci.

„name“, „description“ – jméno a popis zobrazené v UI
„type“ – identifikátor (3. string z názvu souboru)
„help“ – pomocný text zobrazený v UI
„new_revision“ – když je hodnota "true", tak nová revize bude vytvořena s každou úpravou obsahu ("Vytvořit novou revizi" bude zakšrtnuté v UI)
„preview_mode“ – 0 odstraňuje možnost náhledu před vytvořením obsahu, 1 je původní hodnota a umožňuje náhled, 2 vyžaduje nejprve náhled a až potom zobrazí tlačítko "Uložit"

 

drupal typ obsahu name description

 

drupal typ obsahu help text

 

drupal typ obsahu revision

 

Úložiště (field.storage.node.field_foo_id.yml) – nový


langcode: en
dependencies:
  enforced:
    module:
    - my_module
  module:
  - node
id: node.field_foo_id
field_name: field_foo_id
entity_type: node
type: string
settings:
  max_length: 10
module: core
locked: false
cardinality: 1

 

Tento soubor popisuje úložiště hodnot pole. Opět, pole pod „dependencies/enforced/module“ zajišťuje správné propojení a pole pod „dependencies/module“ se skládá z "node" a názvu modulu podle typu pole („type“) – např. „text“, „taxonomy“, „datetime“, „link“, „paragraphs“, „address“, „file“, „image“, ... – tyto 2 pole sa nemusí shodovat.

„id“ – spojení 3. a 4. stringu z názvu souboru
„field_name“ – 4. string z názvu souboru
„type“ – dátový typ např. "text_with_summary", "string", "integer", "datetime", "text_long", "entity_reference", "link", "image", "address", "text", ...
„settings“ – odvíjejí se od "type", je to pole nastavení úložiště, které jsou dostupné při vytváření typu obsahu přes UI, také může být prázdné (hodnota "()")
„module“ – hodnota ze seznamu "dependency / module" - když pole není závislé od žádného modulu (např. Když je to primitivní datový typ), tato hodnota bude "core"
„locked“ – povoluje nebo zakazuje úpravu nastavení pole po instalaci (když modul slouží pouze pro stahování specifických dat, je dobré je zamknout)
„cardinality“ – kolik hodnot může být do pole uložených

 

drupal typ obsahu storage settings

 

drupal typ obsahu locked

 

Nastavení pole (field.field.node.foo.field_foo_id.yml) – nový


langcode: en
dependencies:
  config:
  - field.storage.node.field_foo_id
  - node.type.foo
id: node.foo.field_foo_id
field_name: field_foo_id
entity_type: node
bundle: foo
label: 'Foo ID'
description: 'ID field description'
required: false
default_value: 'example'
settings: { }
field_type: string

 

Tento soubor přidává více nastavení. Seznam „dependencies/config“ obsahuje 2 předchozí soubory. Také zde mohou být závislosti na modulech jak bylo již zmíněno výše, ale protože string je v tomto případě pouze primitivní datový typ, závisí jen na "core". V jiném případě jsou možné hodnoty shodné s těmi v předchozím souboru (kromě "node").

„id“ – spojení 3.-5. stringu z názvu souboru
„field_name“ – strojový název, identifikátor (5. string z názvu souboru)
„bundle“ – 4. string z názvu souboru
„label“, „description“ – zobrazeny v UI
„required“ – pokud je „true“, hodnota musí být zadána před uložením entity
„default_value“ – když není specifikována žádná hodnota, tato bude použitá (a je také zobrazena v UI ve formuláři)
„settings“ – závisí na „type“
„field_type“ – shodné s „type“ z předchozího souboru

 

drupal typ obsahu default value

 

Zobrazení (core.entity_view_display.node.foo.default.yml) – úprava


langcode: en
status: true
dependencies:
  config:
  - field.field.node.foo.field_foo_id
  - node.type.foo
id: node.foo.default
targetEntityType: node
bundle: foo
mode: default
content:
  field_foo_id:
    label: hidden
    type: string
    weight: 100
    settings: {  }
    third_party_settings: {  }

 

Tento soubor popisuje jak bude vypadat obsah zobrazený na stránce. Seznam „dependencies/config“ musí obsahovat všechny vytvořené pole. Seznam „dependencies/module“, který není v mém souboru neboť string nepoužívá žádný modul, musí obsahovat všechny moduly použité typy („type“) polí ze seznamu „content“ („text_default“, ...).

„status“ – povoluje nebo zakazuje zobrazení obsahu
„id“ – spojení 3. - 5. stringu z názvu souboru
„mode“ – poslední string z názvu souboru
„content“ – seznam všech polí, které mají být zobrazeny (klíče jsou strojové názvy polí)
„label“ – když není zadáno, popisek pole bude zobrazen, když má hodnotu "hidden", tak nebude
„type“ – může být odlišný od předchozích "type" - je to identifikátor zobrazovače hodnoty („default_formatter“ v "core/lib/Drupal/Core/Field/Plugin/Field/FieldType/<class_name>.php") - https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Field%21Plugin%21Field%21FieldType%21StringItem.php/8.6.x
„weight“ – musí být rozdílné pro každé pole - určuje pořadí
„settings“, „third_party_settings“ – závisí na „type“

 

Formulář (core.entity_form_display.node.foo.default.yml) – úprava


langcode: en
status: true
dependencies:
  config:
  - field.field.node.foo.field_foo_id
  - node.type.foo
id: node.foo.default
targetEntityType: node
bundle: foo
mode: default
content:
  field_foo_id:
    type: string_textfield
    weight: 100
    settings:
      size: 30
      placeholder: 'example'
    third_party_settings: {  }
hidden: { }

 

Tento soubor popisuje jak bude vypadat formulář na vytváření a editaci daného obsahu. Hodnoty jsou téměř stejné jako v předchozím souboru „Zobrazenie“ ale „type“ v sezname „content“ určuje jiný nástroj, tzv. „widget“ definován pod „default_widget“ v „core/lib/Drupal/Core/Field/Plugin/Field/FieldType/<class_name>.php“ - https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Field%21Plugin%21Field%21FieldType%21StringItem.php/8.6.x
„hidden“ – seznam skrytých elementů

 

drupal typ obsahu placeholder

 

Finální struktura souborů s 1 vlastním polem

 

drupal typ obsahu file structure

Závěry a jak si to usnadnit

Je dobré vědět význam a možnosti jednotlivých řádků v Yamli konfiguračních souborech. Tvorba všech polí takto manuálně však může být velmi náročná, takže je dobré si to usnadnit jednoduchým trikem. Přes UI se vytvoří nový typ obsahu, který později smažeme, ale předtím si exportujeme jeho konfiguraci, kterou už víme jen zkopírovat do Yamli souboru a ušetříme tím učení všech možností. Export je na cestě "/admin/config/development/configuration/single/export".