Programowo zaktualizuj wartość pola

14

Chcę zaktualizować wartość pola węzła, gdy węzeł zostanie zaktualizowany.

Próbowałem przy użyciu kodu wymienionego tutaj Programowo aktualizując węzeł 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();
      }
    }

ale to nie zadziałało. Po zapisaniu węzła pojawia się błąd 500. Próbowałem także wyjąć instrukcję if i podać identyfikator węzła$node = Node::load(1);

Próbowałem także użyć aktualizacji programowej węzła / encji w Drupal 8

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();

}

ale też nie ma szczęścia.

Ponadto próbowałem użyć różnych haczyków entity_presave, entity_update, node_update, ale nie zrobiłem żadnej różnicy.

Bez sssweat
źródło

Odpowiedzi:

25

Możesz wypróbować ten kod:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
źródło
Dzięki temu zadziałało, jeśli ktokolwiek chce dodać inne możliwe odmiany, możesz dodać kolejną odpowiedź.
Bez Sssweat
1
@NoSssweat: czy mam rację, zakładając, że wiersz z „body” w kodzie pokazanym w tej odpowiedzi nie jest tak naprawdę potrzebny, aby odpowiedzieć na twoje pytanie? I ta linia raczej ilustruje, jak możesz robić podobne rzeczy z (np.) Ciałem? Ponadto, skoro twoje pytanie dotyczyło „pola”, czy możesz użyć linii podobnej do linii z „ciałem” dla pola niestandardowego o nazwie maszyny (powiedzmy) field_my_extra_field? Przepraszam za to, co wydaje się przejmowaniem odpowiedzi w celu zadawania nowych pytań, ale samo „pokazywanie kodu” w odpowiedzi (bez żadnego wyjaśnienia) również nie jest tutaj postrzegane jako dobra praktyka, prawda?
Pierre.Vriens
1
@ Pierre.Vriens Użyłem tytułu w moim Q dla uproszczenia. Pomyślałem, że gdybym wiedział, jak zmienić tytuł, byłoby to takie samo dla każdego pola, wystarczy zmienić nazwę maszyny. Okazuje się, że ta odpowiedź używa określonej metody zmiany tytułu, która nie działałaby dla żadnej innej dziedziny, więc tak naprawdę ważne jest, aby pokazał metodę dla ciała.
Bez Sssweat
Nie mogę zapalić tego haka. Ja edytuję typ zawartości, klikam prześlij, ale nic.
Pan Pablo,
7

To kolejna odmiana z użyciem haka, którego pierwotnie próbowałeś użyć.

Myślę, że problem z twoim kodem polega na tym, że próbujesz załadować nową instancję węzła, ale powinieneś użyć węzła podanego jako parametr $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)
  }
}

Edytować:

Dodano instrukcję use do kodu.

4k4
źródło
1
właśnie wypróbowałem twój kod, ale The website encountered an unexpected error. Please try again later.
psuje
1
Ten kod służy wyłącznie do pokazania, jak korzystać z haka. Potrzebujesz odpowiednich instrukcji użytkowania. Możesz się tego dowiedzieć, jeśli zajrzysz do watchdog (/ admin / raporty / dblog).
4k4
1
dodanie use Drupal\node\NodeInterface;kodu nie powoduje już automatycznego zepsucia witryny, ale po zapisaniu węzła pojawia się błąd 500, jak w odpowiedzi na moje pytanie, a dzienniki nic nie logują.
Bez Sssweat
1
Chciałem tylko wskazać na problem: Nie ładuj nowej instancji węzła, ale użyj tej podanej jako parametr funkcji. Jaki błąd kryje się za 500? Sprawdź swoje pliki dziennika lub włącz rejestrowanie błędów.
4k4
1
Wyczyszczam dziennik, więc nie mylę się z pozostałymi poprzednimi błędami, ale po wielokrotnym zapisywaniu i otrzymywaniu błędu pliki dziennika są puste
nr Sssweat
3

Tytuły w Drupal 8 nie są ustawione jak standardowe pola; mają swoją funkcję. Użyj $node->setTitle('New Title');dla węzła lub $entity->setLabel('New Title');dla ogólnej jednostki. Aby uzyskać więcej informacji, zobacz Node :: setTitle .

Tom Bisciglia
źródło