Aktualisieren Sie programmgesteuert den Wert eines Felds

14

Ich möchte den Wert eines Knotenfelds aktualisieren, wenn ein Knoten aktualisiert wird.

Versucht mit dem hier genannten Code Programmgesteuertes Aktualisieren eines Knotens Drupal 8

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

aber es hat nicht funktioniert. Nach dem Speichern des Knotens erhalte ich einen 500-Fehler. Ich habe auch versucht, die if-Anweisung herauszunehmen und eine Node-ID anzugeben$node = Node::load(1);

Ich habe auch versucht, einen Knoten / eine Entität programmgesteuert in Drupal 8 zu aktualisieren

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

aber auch kein glück.

Außerdem habe ich versucht, verschiedene Hooks "entity_presave", "entity_update" und "node_update" zu verwenden, aber keinen Unterschied gemacht.

Kein Sssweat
quelle

Antworten:

25

Sie können diesen Code ausprobieren:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
quelle
Wenn jemand andere mögliche Variationen hinzufügen möchte, kann er gerne eine weitere Antwort hinzufügen.
Kein Sssweat
1
@NoSssweat: Bin ich zu Recht davon ausgegangen, dass die Zeile mit "body" in dem in dieser Antwort gezeigten Code nicht wirklich benötigt wird, um Ihre Frage zu beantworten? Und dass diese Zeile eher illustriert, wie man mit (zB) body ähnliche Dinge machen kann? Da es sich bei Ihrer Frage um ein "Feld" handelte, können Sie eine ähnliche Zeile wie die Zeile mit "body" für ein benutzerdefiniertes Feld mit dem Computernamen "field_my_extra_field" verwenden. Es tut uns leid, dass Sie scheinbar eine Antwort entführt haben, um neue Fragen zu stellen, aber das Anzeigen von Code in einer Antwort (ohne jegliche Erklärung) wird auch hier nicht als eine gute Praxis angesehen, oder?
Pierre.Vriens
1
@ Pierre.Vriens Der Einfachheit halber habe ich in meinem Q den Titel verwendet. Ich dachte mir, wenn ich wüsste, wie man den Titel ändert, würde es für jedes Feld gleich sein, nur den Maschinennamen ändern. Es stellt sich heraus, dass diese Antwort eine bestimmte Methode verwendet, um den Titel zu ändern, die für kein anderes Feld funktioniert. Daher ist es eigentlich wichtig, dass er die Methode für den Textkörper anzeigt.
Kein Sssweat
Ich kann diesen Haken nicht zum Feuern bringen. Ich bearbeite einen Inhaltstyp, klicke auf Senden, aber nichts.
Herr Pablo
7

Dies ist eine weitere Variante der Verwendung des Hakens, den Sie ursprünglich verwendet haben.

Ich denke, das Problem mit Ihrem Code ist, dass Sie versuchen, eine neue Instanz des Knotens zu laden, aber Sie sollten den als Parameter bereitgestellten Knoten verwenden $entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

Bearbeiten:

Die use-Anweisung wurde zum Code hinzugefügt.

4k4
quelle
1
The website encountered an unexpected error. Please try again later.
Habe
1
Dieser Code dient nur zur Veranschaulichung der Verwendung des Hooks. Sie benötigen die richtigen Gebrauchsanweisungen. Sie können dies herausfinden, wenn Sie in Watchdog (/ admin / reports / dblog) suchen.
4. 4.
1
Durch das Hinzufügen von use Drupal\node\NodeInterface;Code wird die Site nicht mehr automatisch unterbrochen, aber nach dem Speichern des Knotens wird der Fehler 500 angezeigt, wie ich ihn in meiner Frage erhalten habe, und in den Protokollen wird nichts darüber protokolliert.
Kein Sssweat
1
Ich wollte nur auf das Problem hinweisen: Laden Sie keine neue Instanz des Knotens, sondern verwenden Sie die als Funktionsparameter bereitgestellte. Welcher Fehler steckt hinter 500? Bitte überprüfen Sie Ihre Protokolldateien oder aktivieren Sie die Fehlerprotokollierung.
4.
1
Ich löschen Sie das Protokoll, so dass ich nicht mit allen anderen vorherigen Fehler verwirrt, aber nach dem Speichern und Erhalten der Fehler mehrmals Logfiles sind leer
Kein Sssweat
3

Titel in Drupal 8 werden nicht wie Standardfelder festgelegt. Sie haben ihre eigene Funktion. Verwendung $node->setTitle('New Title');für einen Knoten oder $entity->setLabel('New Title');für eine generische Entität. Weitere Informationen finden Sie unter Node :: setTitle .

Tom Bisciglia
quelle