it-swarm.com.de

Alternative Möglichkeiten zum programmgesteuerten Hinzufügen von Benutzerfeldern?

Derzeit verwende ich dies, um programmgesteuert Benutzerfelder hinzuzufügen:

function openid_connect_entity_base_field_info(EntityTypeInterface $entity_type) {
    if ($entity_type->id() === 'user') {
        $fields['field_family_name'] = BaseFieldDefinition::create('string')
          ->setLabel(t('Family Name'))
          ->setDescription(t('Add a description'))
          ->setRevisionable(TRUE)
          ->setTranslatable(TRUE)
          ->setDisplayOptions('form', array(
            'type' => 'string_text_field',
            'weight' => 30,
            'default_value' => 0,
          ))
          ->setDisplayConfigurable('form', TRUE);
      }
return $fields;
}

dies führt jedoch dazu, dass der Administrator der Site mein Modul nicht wie gezeigt deinstallieren kann: enter image description here

Gibt es alternative Möglichkeiten, Benutzerfelder programmgesteuert hinzuzufügen, ohne dass der Administrator der Website das Modul, das die Benutzerfelder programmgesteuert hinzugefügt hat, nicht deinstallieren kann?

5
Callum

Ich habe eine Lösung mit .yml-Dateien im Konfigurations-/Installationsverzeichnis Ihres Moduls gefunden.

1. Erstellen Sie das Benutzerfeld

gehen Sie zu Konfiguration -> Personen -> Kontoeinstellungen -> Felder verwalten und drücken Sie "+ Feld hinzufügen". Ich würde empfehlen, dem Feld einen eindeutigen maschinenlesbaren Namen zu geben, um Konflikte zwischen Benutzerfeldern zu vermeiden.

(enter image description here

Aktivieren Sie das Benutzerfeld unter Formularanzeige verwalten und Anzeige verwalten, wenn es auf der Bearbeitungsprofil- und Registrierungsseite des Benutzers angezeigt werden soll.

2.Exportieren der Benutzerfeldkonfiguration

gehen Sie zu Konfiguration -> Entwicklung -> Konfigurationssynchronisation -> Exportieren -> Einzelelement

Wenn Sie zu einem Bildschirm ähnlich dem folgenden gelangen, setzen Sie den Konfigurationstyp auf "Feld" und setzen Sie den Konfigurationsnamen auf das von Ihnen erstellte Feld.

Erstellen Sie in Ihrem Konfigurations-/Installationsordner für Module (bei Bedarf einen erstellen) eine neue Datei, die nach dem unten rot hervorgehobenen Dateinamen benannt ist.

Kopieren Sie abschließend den yml-Text in die gerade erstellte Datei.

(enter image description here

setzen Sie dann den Konfigurationstyp auf "Feldspeicher" und setzen Sie den Konfigurationsnamen auf das von Ihnen erstellte Benutzerfeld.

Erstellen Sie in Ihrem Konfigurations-/Installationsordner (erstellen Sie bei Bedarf eine) eine neue Datei, die nach dem unten rot hervorgehobenen Dateinamen benannt ist (kopieren Sie nicht die Datei in dem Beispiel, in dem Ihr Benutzerfeld einen anderen Namen hat).

Kopieren Sie abschließend den yml-Text in die gerade erstellte Datei.

(enter image description here

SIE BRAUCHEN BEIDE YML-DATEIEN, UM EIN BENUTZERFELD PROGRAMMATISCH ZU ERSTELLEN

Ich empfehle dies für jedes Benutzerfeld, das Sie programmgesteuert hinzufügen möchten, anstatt die Konfiguration zu kopieren und einige Eigenschaften zu ändern.

Mit dieser Methode können Sie das Modul deinstallieren, das diese Benutzerfelder erstellt hat.

7
Callum

Aktualisierte Antwort:

Sie können das Feld bei der Installation des Moduls als Standardkonfiguration angeben. Durch Hinzufügen der Feldkonfiguration zu exportierbaren Dateien (Yaml-Dateien) können diese dann installiert und hinzugefügt werden. Bei der Deinstallation des Moduls bleiben das Feld und die Daten erhalten.

Erstellen Sie in Ihrem Modul die Ordner config/install und platzieren Sie die Konfigurationsdateien dort: Zum Beispiel, wenn ich ein Feld hinzufüge field_test_email Ich würde den Feldspeicher und dann die Instanz auf der Benutzerentität platzieren.

field.storage.user.field_test_email.ymlfield.field.user.user.field_test_email.yml

https://www.drupal.org/docs/8/creating-custom-modules/include-default-configuration-in-your-drupal-8-module

Alte Antwort:

Wenn Sie die Felder und ihre Daten behalten möchten, lautet die kurze Antwort Nein, Sie können und sollten nicht . Felddefinitionen, Konfiguration werden an den Ersteller "das Modul" gekoppelt, und bei der Deinstallation geht alles verloren, was es getan hat.

Drupal unterstützte das Deaktivieren eines Moduls, wurde jedoch entfernt. Siehe Erklärung hier: https://www.drupal.org/node/2225029

Darin steckte eine große Debatte und viel Nachdenken, mit starken Gesprächen auf beiden Seiten. Gründe hierfür sind: * Da Upgrades einiger Contrib-Module nicht funktionieren (und nicht funktionieren können), wenn Upgrades deaktiviert sind. * Weil Daten, die von einem deaktivierten Modul zurückgelassen werden, das später wieder aktiviert wird, Integritätsprobleme und Cruft verursachen. * Einige Upgrades haben zu Datenverlust geführt, da unerwartete Abhängigkeiten, Plugins oder Hooks zu Schlüsselzeiten nicht verfügbar waren - wenn die Dinge deaktiviert waren. .. dieses Problem ist mehrere hundert Argumente lang, daher ist es unfair, zu viel zusammenzufassen.

Während einer Deinstallation werden verschiedene Validatoren aufgerufen, um sicherzustellen, dass das System keine Daten beschädigt oder aufbewahrt, die später nicht verarbeitet werden können. In Ihrem Fall gibt Ihnen der Validator FieldModuleUninstallValidator diese Fehlermeldungen.

Um das Modul zu deinstallieren, müssen alle Daten gelöscht werden. Sie können versuchen, die Feld-API-Massenlöschung dafür zu verwenden: https://api.drupal.org/api/drupal/core!modules!field!field.purge.inc/group/field_purge/8.2.x

0
johndevman