Wie kann man Felder von Taxonomiebegriffen programmgesteuert ändern?


7

Wie füge ich in D7 Felder zu Taxonomiebegriffen programmgesteuert hinzu / ändere sie? Sie sind klar feldfähig und in der Benutzeroberfläche kann ich Felder in ihnen hinzufügen und bearbeiten, genau wie in Knoten, aber es erwies sich als keine leichte Aufgabe im Code. Angenommen, ich habe einen Wortschatz namens Fruit mit Begriffen wie Äpfel und Bananen. Ich habe ein Feld mit dem Namen hinzugefügt main_article_id, sodass alle Begriffe Name, Beschreibung und Hauptartikel-ID haben. Wenn ich einen Knoten mit dem Namen Äpfel erstelle, der einen Verweis auf das Fruchtvokabular ( field_fruit) enthält und der Begriff Äpfel ausgewählt ist, sollte der Code den Begriff Äpfel aktualisieren und sein main_article_idFeld auf setzen $node->nid. Hier ist mein Code:

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['value'];
    $taxonomy_term = taxonomy_term_load($value['tid']);
    if($taxonomy_term != FALSE)
    {
        //doesn't work
        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0]['value'] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

Antworten:


9

Der Spaltenname für ein Feld ist nicht immer vorhanden value. Bei Taxonomie-Termreferenzen ist dies tidder Fall, und bei Knoten- / Entitätsreferenzen hängt es davon ab, welches Modul Sie verwenden.

Für ein Feld , die erstellt mit Referenzen Modul der Name ist nid, und für ein das erstellen mit Entity - Referenz - Modul, dann ist es target_id.

Der folgende Code sollte etwas besser funktionieren:

//hook_node_insert fires after new node has been inserted into db
function MYMODULE_node_insert($node)
{
    $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];

    // $value['tid'] isn't defined anywhere in this function scope so I 
    // assume you meant to use $taxonomy_term_id here
    $taxonomy_term = taxonomy_term_load($taxonomy_term_id);
    if($taxonomy_term != FALSE)
    {
        $column_name = 'nid'; // Or 'target_id' if you're using entity reference            

        $taxonomy_term->field_main_article_id[LANGUAGE_NONE][0][$column_name] = $node->nid;
        taxonomy_term_save($taxonomy_term);
    }
}

Sie haben Recht $value['tid'], entschuldigen Sie den Fehler im Code. Aber ich benutze keine Module, um mein Feld zu erstellen. Ich habe es gerade manuell auf der Seite "Vokabeln bearbeiten" hinzugefügt. Ich habe versucht, taxonomy_term zu betrachten, als ich es in der Benutzeroberfläche bearbeitet habe. Innerhalb von hook_taxonomy_term_presave ($ term) $ term sah es so aus in print_r(): stdClass Object ([tid] => 20 [vid] => 6 [name] => Fruit ... [field_main_article_id] => Array ([und] => Array ([0] => Array ([Wert] => 14) )
Ari Linn

Gotcha, das sollte man 'value'dann definitiv sein . Die Referenz für den Taxonomiebegriff wird jedoch definitiv auch sein 'tid'. Vielleicht müssen Sie nur diese Zeile ( $taxonomy_term_id = $node->field_FRUIT[LANGUAGE_NONE][0]['tid'];) und nicht die andere ändern
Clive

das schon gemacht. :-) Trotzdem funktioniert es nicht. Übrigens habe ich mir das Ergebnis angesehen taxonomy_term_load($taxonomy_term_id)und es sah so aus: stdClass Object ( [tid]=> 1 [vid]=> 2 [name]=> Äpfel [description]=> [format]=> full_html [weight]=> 0 [vocabulary_machine_name]=> Frucht [rdf_mapping]=> ...). Mein Schatz field_main_article_idist nirgends zu finden (ich kann es aber in der Benutzeroberfläche perfekt sehen). Sollte so taxonomy_term_loadarbeiten?
Ari Linn

Entschuldigung nochmal, mein schlechtes. Ich war dumm und habe an die falsche Stelle geschaut, deshalb habe ich keine Änderungen in meinen Taxonomie-Begriffen gesehen. Ihr Code funktioniert. Vielen Dank.
Ari Linn

Sollte taxonomy_term_saveauch für die Aktualisierung der Eltern eines Semesters arbeiten? Ich versuche, es für diesen Zweck zu verwenden, aber ich habe ein Problem mit der Aktualisierung der Daten.
Brent Connor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.