Ist es akzeptabel, die vid-Spalte eines Begriffs programmgesteuert in der Datenbank zu ändern?

8

Ich muss einige Begriffe von einem Vokabular in ein anderes verschieben, indem ich alle Daten behalte: Übersetzungen, Aliase und Knotenreferenzen.

Ist es akzeptabel, den vidSpaltenwert direkt in der Datenbank zu ändern ? Die Begriffe haben keine Hierarchiebeziehungen, die behandelt werden müssen.

Molfar
quelle

Antworten:

11

Datenbank

Es ist möglich, viele Dinge in Drupal zu tun, indem Sie einfach SQL-Abfragen entweder über Drupal oder extern durchführen. Im Allgemeinen möchten Sie diesen Ansatz niemals wählen. Es gibt einige Fälle, in denen es gut funktionieren kann, aber meistens gibt es keinen Grund, dies so zu tun.

API

Drupal verfügt über eine umfangreiche API. Dies gilt für Drupal 6, 7 und 8, da sie in Drupal schon immer eine wichtige Funktion waren. In Ihrem Concreate-Beispiel können Sie eine Aktualisierung eines Begriffs verwenden taxonomy_term_loadund taxonomy_term_saveerleichtern. Auf diese Weise können Sie jeden Datenteil bearbeiten, einschließlich des vid. Nur weil Sie es mit APIs tun, die verbotene Dinge tun, funktioniert dies nicht automatisch, aber die Chance, dass die Dinge gut laufen, wird drastisch verbessert.

In diesem konkreten Beispiel führt die API nichts aus, was unbedingt benötigt wird. Es legt einige interne Daten für den Begriff fest und ruft das Hooks-Letter-Modul auf, das weiß, dass es aktualisiert wurde.

Sie sollten beachten, dass Dinge kaputt gehen können, wenn der Begriff, den Sie ändern möchten, Teil einer Hierarchie ist. Bei Knoten, die auf den Begriff verweisen, kann es auch zu Unterbrechungen kommen, wenn das Feld nicht auf Begriffe im neuen Vokabular verweisen darf.

Migration

Die Migration von Daten ist die kugelsichere Lösung. Wenn Sie nicht über einen großen Datensatz verfügen, können Sie diese ganz einfach entwickeln und ausführen. Die Idee ist, einen neuen Begriff zu erstellen und den zu migrierenden Inhalt zu migrieren und dann den alten Begriff zu löschen. Als Update-Hook könnte der Beispielcode folgendermaßen aussehen:

/**
 * Put in modules .install file, replace xxxx with 7000 or higher
 */
function MODULE_NAME_update_XXXX(&$sandbox) {
  $term = taxonomy_term_load(CONSTANT_WITH_TID);
  $new_term = clone $term;
  unset($new_term->tid);
  unset($new_term->tid);
  $new_term->vid = CONSTANT_WITH_VID;
  taxonomy_term_save($term);
  // Find all nodes we want to update and update them.
  // If there is a lot of nodes, can use $sandbox to make this a batch job.
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
    ->fieldCondition('field_which_is_term_reference', 'tid', $term->tid);
  $result = $query->execute();
  foreach (node_load_multiple(array_keys($result['node'])) as $node) {
    $node->field_which_is_term_reference[LANGUAGE_NONE][0]['tid'] = $term->tid;
    node_save($node);
  }
  // Migration all done - delete the old term.
  taxonomy_term_delete($term->tid);
}

Bitte beachten Sie, dass der obige Code ein reiner Beispielcode ist, der auswendig geschrieben wurde. Kann Syntaxfehler oder andere Fehler aufweisen und viele Annahmen treffen. Dies dient nur dazu, eine Idee zu veranschaulichen und zu demonstrieren, dass eine Migration möglicherweise keine große Sache ist.

googletorp
quelle
4

Es ist nicht ratsam , direkte Datenbankänderungen vorzunehmen, wenn Sie mit Drupal arbeiten. Aber ja, wenn wir wissen, wo sich dies alles auswirken kann, und notwendige Änderungen entsprechend vornehmen können, ist es in Ordnung , direkte Änderungen in der Datenbank vorzunehmen. Denn in diesem Fall ist dies nicht über die Benutzeroberfläche möglich. HINWEIS: Wenn Sie Knoten haben, die mit Term verknüpft sind, müssen Sie dies ebenfalls manuell behandeln.

Schauen Sie sich diesen Link an, der erklärt, wie wir den Begriff Vokabular in Drupal 7 ändern können : Ändern Sie den Wortschatz eines Taxonomiebegriffs in Drupal 7 mithilfe der Datenbank .

Yogesh
quelle
Ein einziges Problem, das ich dabei sehe, ist: Wenn an einen Begriff Felder mit einigen Werten angehängt sind und Sie dessen Video ändern, gehen die im Feld gespeicherten Daten verloren.
Ashish Deynap
Ja, deshalb habe ich auch erwähnt, dass, wenn Knoten angeschlossen sind, diese ebenfalls behandelt werden müssen .
Yogesh
Aber werden Daten auch von vid an den Begriff angehängt? nicht nur per tid key?
Molfar
Nein, alle an den Begriff angehängten Daten beziehen sich auf tid. vid wird verwendet, um nur auf die Vokabular-ID zu verweisen, sonst nichts.
Yogesh
4

Ich würde nicht empfehlen, diesen Begriff so zu ändern, wie Sie ihn in Ihrer Frage beschrieben haben. Stattdessen würde ich einen alternativen Ansatz verwenden, um ein ähnliches Ergebnis (in der angegebenen Reihenfolge) zu erzielen, das weiter unten näher erläutert wird.

Schritt 1 - Verwenden Sie den neuen Begriff in zukünftigen Knotenaktualisierungen

Erstellen Sie ein neues Taxonomiebegriffsfeld, damit "von nun an" alle zukünftigen Knotenaktualisierungen (oder neue Knoten, die erstellt werden) dieses neue Feld verwenden. Ich gehe davon aus, dass diese Begriffe für Knoten verwendet werden (wenn Sie sie für einen anderen Entitätstyp wie Benutzer usw. verwenden), kann der gleiche Ansatz auch für diese Entitäten verwendet werden.

Verwenden Sie das Modul Regeln , um eine Regel wie folgt zu erstellen:

  • Regelereignis : before saving content.
  • Regelbedingungen:
    • entity has field, mit Feld = das alte Feld.
    • UND NICHT ( entity has fieldmit Feld = das neue Feld).
  • Regeln Aktion: set Drupal messageEnthält einige Anweisungen, dass das alte Feld ausgeblendet werden muss und das neue Feld die entsprechenden Werte enthalten sollte.

Schritt 2 - Verwenden Sie Regeln, um den Prozess zu beschleunigen

Offensichtlich wird der Ansatz in Schritt 1 "einige" Zeit in Anspruch nehmen, wenn dies manuell durchgeführt werden muss, jeweils 1 Knoten. Aber mit Ansichten (eine Liste von ähnlichen Knoten bauen aktualisiert werden) und VBO (Massen Update solche Listen) Sie können (sollten!) Der Lage sein , ziemlich viel um diesen Prozess zu beschleunigen.

Insbesondere, wenn Sie Regeln verwenden würden , um eine benutzerdefinierte Massenoperation für eine solche VBO-Ansicht zu erstellen, wie in der Antwort auf " Wie werden Regeln zum Erstellen einer benutzerdefinierten Massenoperation für eine VBO-Ansicht verwendet? " Erläutert . Hier ist ein Prototyp einer Regelkomponente, die bei der Implementierung eines solchen benutzerdefinierten Massenvorgangs (im Regelexportformat) helfen soll:

{ "rules_replace_a_term_field_by_another_term_field" : {
    "LABEL" : "Replace a term field by another term field",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "node" : { "label" : "Node", "type" : "node" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_sample_tags" } },
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_demo_tags" } },
      { "data_is" : { "data" : [ "node:field-demo-tags" ], "value" : "1" } }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "node:field-sample-tags" ], "value" : "31" } },
      { "drupal_message" : { "message" : "Term updated in node with id = [node:nid]" } }
    ]
  }
}

Einige weitere Details zur Erklärung des obigen Prototyps:

  • Es verwendet einen Knoten als Parameter.
  • Dies sind die Regelbedingungen:

    • Überprüfen Sie, ob die Entität (= Knoten) ein Feld hat field_sample_tags.
    • Überprüfen Sie, ob die Entität (= Knoten) ein Feld hat field_demo_tags.
    • Überprüfen Sie, ob der Wert des Felds field_demo_tagsdem zu ersetzenden Begriff entspricht (in diesem Beispiel hat der Begriff id = 1). Beachten Sie, dass keine Regelaktionen ausgeführt werden, wenn diese Bedingung nicht erfüllt ist.
  • Dies sind die Regelaktionen:

    • Setzen Sie den Wert des Feldes field_sample_tagsgleich dem Begriff mit dem Begriff id = 31(dies ist der Begriff im neu erstellten Vokabular, der mit dem Begriff im zu ersetzenden Vokabular übereinstimmt).
    • Zeigen Sie eine Nachricht auf der Site wie an Term updated in node with id = 72, während 72die Knoten-ID des aktualisierten Knotens ist.

Wenn Sie möchten, passen Sie die Computernamen der Feldnamen im obigen Prototyp und die verwendeten Begriffs-IDs an. Importieren Sie es dann in Ihre eigene Site (mithilfe der Benutzeroberfläche für Regeln) und testen Sie die Qualitätssicherung mithilfe des Links "Ausführen" rechts neben der importierten Regelkomponente (und geben Sie eine Knoten-ID ein, um sie zu testen, nachdem Sie zu "Direkteingabe" gewechselt haben mode ", um eine Knoten-ID angeben zu können). Wenn Sie während des Testens keine solche Term updated in node ...Nachricht erhalten, muss dies daran liegen, dass der von Ihnen ausgewählte Knoten nicht den in Ihrer Regelbedingung angegebenen Begriffswert verwendet hat.

Schritt 3 - Verwenden Sie VBO als letzten Schliff

Nachdem Sie die QS-Prüfung dieser Regelkomponente aus Schritt 2 abgeschlossen haben, erstellen Sie eine VBO-Ansicht der zu verarbeitenden Knoten, in der Sie auf den obigen Regelprototyp (oder eine Variation davon, die Ihren Anforderungen entspricht) verweisen.

Nutzen Sie diesen Ansatz

Mit diesem Ansatz minimieren Sie das Risiko, Dateninkonsistenzen einzuführen (im Vergleich zum direkten Aktualisieren der Datenbank), ohne dass benutzerdefinierter Code erforderlich ist (Sie würden nur die Benutzeroberfläche für Ansichten und Regeln verwenden).

Pierre.Vriens
quelle
Sie gehen davon aus, dass Ansichten, VBO und Regeln bereits installiert sind. Andernfalls müssen Sie 3 Module für diese Lösung installieren. Darüber hinaus ist der zu implementierende Konfigurationscode nicht weniger komplex als das, was für einen Update-Hook erforderlich wäre. Mein Punkt ist, dass die Verwendung von Regeln und Ansichten nicht so einfach ist, wie Sie es klingen lassen. Denken Sie auch daran, dass Sie mit Ansichten und Regeln zwar fast alles erstellen können, dies jedoch nicht immer eine gute Idee ist.
googletorp
1
Ja, um Ansichten, Regeln oder VBO verwenden zu können, muss das Modul installiert sein (+ aktiviert). Aber von den ungefähr 990.000 D7-Sites gibt es ungefähr 810.000 Sites, die auch Ansichten haben , das sind über 80%. Und für Websites, die keinen Grund haben, Rules oder VBO zu verwenden: Diese Module werden nur für eine solche Konvertierung benötigt (wenn sie fertig sind, können sie entfernt werden, wenn Sie möchten). Über die Einfachheit: IMO, das ist eher ein Erfahrungsproblem. Der Vorteil dieses Ansatzes besteht darin, dass nur Kenntnisse zum Erstellen von Websites erforderlich sind (ein erfahrener PHP-Entwickler ist möglicherweise nicht verfügbar / erschwinglich).
Pierre.Vriens
2

Ich weiß, dass Sie programmgesteuert sagen, aber wenn Sie ein Modul verwenden möchten, können Sie Taxonomy Manager verwenden

Dieses Modul bietet eine leistungsstarke Schnittstelle zum Verwalten von Taxonomien. Ein Vokabular wird in einer dynamischen Baumansicht angezeigt, in der übergeordnete Begriffe erweitert werden können, um ihre verschachtelten untergeordneten Begriffe aufzulisten, oder reduziert werden können.

Der Taxonomy Manager verfügt über folgende Funktionen und Hauptfunktionen:

  • dynamische Baumansicht
  • Massenlöschung
  • Massenaddition neuer Begriffe
  • Verschieben von Begriffen in Hierarchien Zusammenführen von Begriffen (mithilfe des Moduls zum Zusammenführen von Begriffen in 7.x)
  • Schnelle Gewichtsänderung mit Auf- und Abwärtspfeilen (und AJAX-Einsparung)
  • AJAX-basiertes Formular zur Bearbeitung von Begriffen
  • einfache Suchoberfläche
  • CSV Export von Begriffen
  • i18n-Unterstützung für mehrsprachige Vokabeln (nach Sprachbegriffen)
  • Double Tree-Oberfläche zum Verschieben von Begriffen in Hierarchien, Hinzufügen neuer Übersetzungen und Wechseln von Begriffen zwischen verschiedenen Vokabularen
Adrian Cid Almaguer
quelle