it-swarm.com.de

Programmgesteuertes Aktualisieren eines Felds, hook_node_update

Derzeit wird versucht, ein Feld jedes Mal zu aktualisieren, wenn ein Knoten erstellt oder aktualisiert wird. Habe der Wert jedoch nicht innerhalb des Knotens ausgefüllt. Habe ich mit diesem bestimmten Hook Zugriff auf das Knotenobjekt? Was könnte ich vermissen?

  function vbtoken_node_update($node) {


      entity_get_controller('node')->resetCache(array($node->nid));


      $types = node_type_get_types(); //What are the current Node Content Types?
      $yes = ($types['volunteer_project']->type);

      if($node->type === $yes){


        $hash = md5($node->title . $node->nid . $node->nid);
        $hashed = substr($hash, 0, 6);
        $node = node_load($node->nid);
        $node->tcode[$node->language][0]['value'] = $hashed;
        node_save($node);

        watchdog('vbtoken', 'Added a new Token code to %nid', array('%nid' => $node->nid));

        }
        else 
        {
          dpm('not working dude');
        }

    }
13

Wrapper für Entitätsmetadaten

Die Entitäts-API bietet einige Wrapper-Klassen, mit denen Sie problemlos mit Entitäten umgehen und die bereitgestellten Informationsmodule für Entitätseigenschaften nutzen können. Mit Hilfe der Wrapper können Sie auf die Eigenschaftsinformationen zugreifen, bekannte Eigenschaften durchlaufen oder einfach die beschriebenen Datenwerte abrufen/festlegen usw.

Dies sind einige einfache Verwendungsbeispiele aus der README-Datei:

Um diese Informationen (Metadaten) nutzen zu können, bietet das Modul einige Wrapper-Klassen, die das Abrufen und Festlegen von Werten erleichtern. Der Wrapper unterstützt die verkettete Verwendung zum Abrufen von Wrappern von Entitätseigenschaften, z. Um die E-Mail-Adresse eines Knotenautors zu erhalten, kann man Folgendes verwenden:

$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();

Um die E-Mail-Adresse des Benutzers zu aktualisieren, könnte man verwenden

$wrapper->author->mail->set('[email protected]');

oder

$wrapper->author->mail = '[email protected]';

Die Wrapper geben die Daten immer wie in den Eigenschaftsinformationen beschrieben zurück, die direkt über entity_get_property_info () oder vom Wrapper abgerufen werden können:

$mail_info = $wrapper->author->mail->info();

Um zu erzwingen, dass ein Textwert für die Ausgabe bereinigt wird, kann man z.B.

$wrapper->title->value(array('sanitize' => TRUE));

um den bereinigten Knotentitel zu erhalten. Wenn eine Eigenschaft wie der Knotenkörper bereits standardmäßig bereinigt zurückgegeben wird, möchte man möglicherweise die nicht bereinigten Daten so abrufen, wie sie in einem Browser für andere Anwendungsfälle angezeigt werden. Zu diesem Zweck kann die Option 'decodieren' aktiviert werden, mit der sichergestellt wird, dass für bereinigte Daten die Tags entfernt und HTML-Entitäten decodiert werden, bevor die Eigenschaft zurückgegeben wird:

$wrapper->body->value->value(array('decode' => TRUE));

Auf diese Weise erhält man die Daten immer wie dem Benutzer gezeigt. Wenn Sie jedoch den unverarbeiteten Rohwert auch für bereinigte Textdaten wirklich erhalten möchten, können Sie dies tun über:

$wrapper->body->value->raw();

Mehr Beispiele:

$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';

$wrapper->save();
$wrapper->delete();

Weitere Dokumente : http://drupal.org/node/1021556

16
retif

Das Aufrufen von field_attach_update('node', $node) am Ende von hook_node_update Hat bei mir funktioniert. Ich gehe davon aus, dass field_attach_insert('node', $node) am Ende von hook_node_insert Auch funktionieren würde. Eine Beispielfunktion würde also so aussehen:

function mymodule_node_update($node) {
  $new_value = // ...do some stuff to compute a new value for the field.
  $node->field_my_field[LANGUAGE_NONE][0]['value'] = $new_value;
  field_attach_update('node', $node);
}

Sie müssen nicht node_loadnode_save Aufrufen oder etwas zurückgeben.

Ich denke, der Grund dafür ist, dass node_save, Von dem aus hook_node_update Und hook_node_insert Aufgerufen werden, alle Datenbankabfragen in eine Transaktion einschließt. (Beachten Sie die erste Zeile von node_save: $transaction = db_transaction().) Diese Abfragen werden erst aufgerufen, wenn node_save Beendet ist. Die letzte Abfrage, die node_save Zur Transaktion hinzufügt, wird von field_attach_update Aufgerufen, wobei das $ node-Objekt so verwendet wird, wie es vorherhook_node_update Ist namens. Sie müssen also eine weitere Abfrage in die Warteschlange stellen, indem Sie erneut field_attach_update Aufrufen. Zumindest verstehe ich so, was los ist.

Wenn Sie Probleme haben, Nichtfeldattribute des Knotens zu ändern (z. B. $node->log), Rufen Sie auch _node_save_revision($node, $user->uid, 'vid'); auf. Dadurch wird keine neue Revision erstellt.

14
grobemo

So ändern Sie Werte auf einem Knoten:

$node = node_load($nodeID);
$node->field_fieldname['und'][0]['value'] = $val;
node_save($node);
2
Lance

Eine Verbesserung der obigen Lance-Lösung, bei der das Speichern eines gesamten Knotens vermieden wird, wenn nur wenige Feldwerte geändert werden:

$node = node_load($nodeID);
// for each field whose value remains unchanged
unset($node->field_<field-name>); 
// for each field whose value changes
$node->field_<field-name>[LANGUAGE_NONE][0]['value'] = <new-value>;
field_attach_update('node', $node);
entity_get_controller('node')->resetCache(array($node->nid));

Dies kann auch nützlich sein, um Nebenwirkungen von node_save() zu vermeiden.

Quelle: Speichern der Knotenfelder ohne Speichern des Knotens selbst

https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself

1
amuli