[gelöst] Einen Taxonomy term automatisch erstellen
am 10.04.2012 - 10:04 Uhr in
Wenn ich eine neue Node erstelle, möchte ich automatisch eine Topic-ID vergeben, die aus Text-node:url-user-uid-node-:created:raw-current besteht, welche als ein neuer Taxonomy Term gespeichert werden soll.
Ich schaffe es mit der Hilfe von Token diese Topic-ID in ein Field zu schreiben, doch wie lege ich diesen Wert als neuen Taxonomy Term automatisch fest.
Dank im Voraus.
Saludos,
Schnittmenge
- Anmelden oder Registrieren um Kommentare zu schreiben

Also ich vermute, dass ich
am 10.04.2012 - 11:22 Uhr
Also ich vermute, dass ich mit http://drupal.org/project/computed_field folgenden hook aufrufen muss => http://api.drupal.org/api/drupal/modules!taxonomy!taxonomy.api.php/function/hook_taxonomy_term_insert/7 um die entsprechende Topic-ID als Taxonomy Term festzulegen. Geht das in die richtige Richtung oder gibt es da noch andere Ansätze?
Rules
am 10.04.2012 - 22:00 Uhr
Mit Rules sollte man das lösen können => http://drupal.org/project/rules
Das Erzeugen des Term funktioniert wie gewünscht, jedoch noch nicht das zuweisen zu dem ursprünglichen Node. Habe jetzt den Term unabhängig vom Node erstellt.
Das Zuweisen wäre einfach, wenn man den Term kennen würde, ist aber hier nicht der Fall. Wo stehe ich auf dem Schlauch?
Zitat: Ich schaffe es mit der
am 11.04.2012 - 00:22 Uhr
Ich schaffe es mit der Hilfe von Token diese Topic-ID in ein Field zu schreiben, doch wie lege ich diesen Wert als neuen Taxonomy Term automatisch fest.
und
Das Zuweisen wäre einfach, wenn man den Term kennen würde
Das klingt für mich danach, dass du sehr wohl den Term kennst.
lieben Gruß
Berthold Lausch
Ja, Berthold, Du hast recht,
am 11.04.2012 - 06:32 Uhr
Ja, Berthold, Du hast recht, der Term steht zur Verfügung, wird aber nicht zur Liste dazu gefügt.
Es müsste funktionieren, tut es aber nicht ... Der Report:
Rules debug information:
" Reacting on event After saving new content.
0 ms Reacting on event After saving new content.
10.369 ms Evaluating conditions of rule Rule new topic id. [edit]
10.91 ms The condition node_is_of_type evaluated to TRUE [edit]
10.921 ms AND evaluated to TRUE.
" Rule Rule new topic id fires. [edit]
0 ms Rule Rule new topic id fires.
17.783 ms Evaluating the action entity_create. [edit]
18.136 ms Added the provided variable entity_created_topic_id of type taxonomy_term [edit]
20.116 ms Evaluating the action list_add. [edit]
23.148 ms Evaluating the action drupal_message. [edit]
23.342 ms Rule Rule new topic id has fired.
34.344 ms Saved entity_created_topic_id of type taxonomy_term.
35.587 ms Finished reacting on event After saving new content.
Die drupal_message gibt den richtigen entity_created_topic_id Wert aus, jedoch wird dieser nicht zu der Liste der taxonomy_terms des Nodes dazu gefügt. Kann das daran liegen, dass der entity_created_topic erst später (34.344 ms) gespeichert wird? Wie sollte ich vorgehen?
Saludos,
Schnittmenge
Vielen Dank an yannickoo
am 12.04.2012 - 06:50 Uhr
Es hat sich bestätigt, dass es ein zeitliches Problem gibt. So liegt zum Beispiel die nid nicht vor dem Speichern des Nodes vor, welche ein Bestandteil von der Topic-ID war.
Lösung:
Die Topic-ID wird vor dem ersten Aufruf des Nodes als Taxonomy Term angefügt. Der Code =>
<?php
/**
* Implements hook_node_view()
*/
function wiki9999_node_view($node) {
// Wenn eine Node des Typs "topic" gespeichert wurde...
if($node->type == 'topic') {
// Wir speichern uns das Topic in eine Variable. http(s):// loeschen wir.
$topic = 'wiki9999-' . str_replace(array('https://', 'http://'), array('', ''), $GLOBALS['base_url'] ) . '/node/' . $node->nid . '-' . $node->uid . '-' . $node->created;
// Wir bauen uns einen Term-Array auf
$term = array(
// Id des Vokabulars 'topic-id-taxonomy'.
'vid' => 2,
'name' => $topic,
);
// Wir gucken ob es den Term schon gibt, und speichern uns die Anzahl als Boolean (TRUE oder FALSE).
$term_exists = db_query('SELECT name FROM {taxonomy_term_data} WHERE name = :topic', array(':topic' => $topic))->rowCount();
$term_exists = (bool) $term_exists;
// Falls der Term noch nicht existiert, legen wir ihn an.
if(!$term_exists) {
taxonomy_term_save((object) $term);
}
// Wir holen uns den ersten Term mit dem Namen $topic.
$saved_term = taxonomy_get_term_by_name($topic);
$saved_term = array_shift(array_values($saved_term));
// Wir setzen eine Variable, in welcher spaeter steht, ob die Node einen Term hat.
$node_has_topic_term = FALSE;
if(isset($node->field_topic_id_taxonomy[$node->language])) {
foreach($node->field_topic_id_taxonomy[$node->language] as $topic_term) {
// Falls es bereits einen Term mit dem $topic gibt...
if($topic_term['tid'] == $saved_term->tid) {
$node_has_topic_term = TRUE;
}
}
}
// Wenn die Node noch nicht das $topic als Term hat...
if(!$node_has_topic_term) {
// ... setzen wir manuell den Term in das Node-Objekt...
$node->field_topic_id_taxonomy[$node->language][] = array('tid' => $saved_term->tid, 'taxonomy_term' => $saved_term);
// ... und speichern die Node.
node_save($node);
}
}
}
?>