Wie kann ich ein neues Feld aus der Konfiguration in hook_update_N hinzufügen? [Duplikat]

Nov 23 2020

Ich muss Taxonomie durch PHP-Code hinzufügen. Taxonomie muss 2 Felder haben. Ich habe test_taxonomy.install eine neue Funktion hinzugefügt, und es scheint zu funktionieren:

function taxonomy_update_8805() {

    $config_path = 'modules/feature/test_taxonomy/config/update/'; $source = new FileStorage($config_path); \Drupal::entityManager()->getStorage('taxonomy_vocabulary') ->create($source->read('taxonomy.vocabulary.regulation'))
        ->save();
}

Neue Vokabeln zur Taxonomie hinzugefügt.

Inhalt der Datei:

langcode: pl
status: true
dependencies:
  module:
    - test_remote_vocabulary
third_party_settings:
  test_remote_vocabulary:
    is_remote: 0
name: 'Test'
vid: regulation
description: 'Test desc'
hierarchy: 0
weight: 0
 

Der problematische Teil ist, wenn ich versuche, Felder zum Wortschatz hinzuzufügen. Ich habe 2 Dateien erstellt

field.storage.taxonomy_term.field_regulation_test.yml

langcode: pl
status: true
dependencies:
  module:
    - taxonomy
    - text
id: taxonomy_term.regulation.test
field_name: test_field
entity_type: taxonomy_term
type: text_long
settings: {  }
module: text
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

field.field.taxonomy_term.field_regulation_test.yml

langcode: pl
status: true
dependencies:
  config:
    - field.storage.taxonomy_term.field_regulation_test
    - taxonomy.vocabulary.regulation
id: taxonomy_term.regulation.test
field_name: test_content
entity_type: taxonomy_term
bundle: regulation
label: TEST
description: 'Tekst test'
required: true
translatable: false
default_value: {  }
default_value_callback: ''
settings: {  }
field_type: text_long

Aber ich bin nicht sicher, wie ich sie in die Funktion update_xxx laden kann.

EDIT: Ich habe es versucht

    \Drupal::entityManager()->getStorage('taxonomy_term')
        ->create($source->read('field.storage.taxonomy_term.field_regulation_abo')) ->save(); \Drupal::entityManager()->getStorage('taxonomy_term') ->create($source->read('field.field.taxonomy_term.field_regulation_abo'))
        ->save();

Beim Versuch, das Modul zu aktualisieren , wird jedoch ein fehlendes Bundle für den Entitätstyp taxonomy_term angezeigt

Antworten

3 leymannx Nov 23 2020 at 15:36

Ja, Sie können keine Inhalte erstellen, bevor die vertrauende Konfiguration importiert wurde. Das ist ein klassisches Drupal 8-Paradoxon, das erst kürzlich durch einen neuen Haken gelöst wurde : hook_deploy_NAME(&$sandbox).

Aktualisieren Sie auf den neuesten Drush und führen Sie ihn von nun an drush deployals Teil Ihrer Bereitstellungsroutine aus, die die alte drush updb && drush cimRoutine ersetzt. Erstellen Sie dann eine neue Datei in Ihrem Modul : MYMODULE.deploy.php. In dort implementieren, MYMODULE_deploy_NAME(&$sandbox)wo NAMEkann ein beliebiger eindeutiger Name (oder eine inkrementierende Nummer auch) sein. Verwenden Sie diesen Haken, um die Begriffe zu erstellen, wie hook_update_N(&$sandbox)in Ihrer Frage.

drush deploy stellt sicher, dass dieser Hook zuletzt in der Bereitstellungsroutine aufgenommen wird, nachdem die vertrauende Konfiguration aus dem Konfigurationsimport erstellt wurde.