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_load
und taxonomy_term_save
erleichtern. 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.
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:
before saving content
.entity has field
, mit Feld = das alte Feld.entity has field
mit Feld = das neue Feld).set Drupal message
Enthä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:
Einige weitere Details zur Erklärung des obigen Prototyps:
Dies sind die Regelbedingungen:
field_sample_tags
.field_demo_tags
.field_demo_tags
dem 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:
field_sample_tags
gleich dem Begriff mit dem Begriff id =31
(dies ist der Begriff im neu erstellten Vokabular, der mit dem Begriff im zu ersetzenden Vokabular übereinstimmt).Term updated in node with id = 72
, während72
die 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).
quelle
Ich weiß, dass Sie programmgesteuert sagen, aber wenn Sie ein Modul verwenden möchten, können Sie Taxonomy Manager verwenden
quelle