Actualizar mediante programación el valor de un campo

14

Quiero actualizar el valor de un campo de nodo cuando se actualiza un nodo.

Intenté usar el código mencionado aquí Actualización programática de un nodo 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();
      }
    }

Pero no funcionó. Me sale un error 500 después de guardar el nodo. También intenté sacar la declaración if y especificar un id de nodo$node = Node::load(1);

También intenté usar la actualización de un nodo / entidad mediante programación en 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();

}

pero tampoco suerte.

Además, intenté usar diferentes ganchos entity_presave, entity_update, node_update, pero no hice ninguna diferencia.

No Sssweat
fuente

Respuestas:

25

Puedes probar este código:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}
MrD
fuente
Gracias, esto funcionó, si alguien más quiere agregar otras posibles variaciones, siéntase libre de agregar otra respuesta.
No Sssweat
1
@NoSssweat: ¿estoy en lo cierto al suponer que la línea con "cuerpo" en el código que se muestra en esta respuesta no es realmente necesaria para responder a su pregunta? ¿Y que esta línea ilustra más bien cómo puede hacer cosas similares con (por ejemplo) el cuerpo? Además, dado que su pregunta era sobre un "campo", ¿podría usar una línea similar a la línea con "cuerpo" para un campo personalizado, con el nombre de la máquina (por ejemplo) field_my_extra_field? Perdón por lo que parece secuestrar una respuesta para hacer nuevas preguntas, pero simplemente "mostrar código" en una respuesta (sin ninguna explicación) tampoco se percibe como una buena práctica por aquí, ¿verdad?
Pierre.Vriens
1
@ Pierre.Vriens Usé el título en mi Q por simplicidad. Pensé que si supiera cómo cambiar el título, sería lo mismo para cualquier campo, solo cambiar el nombre de la máquina. Resulta que esta respuesta usa un método específico para cambiar el título, que no funcionaría para ningún otro campo, por lo que es realmente importante que muestre el método para el cuerpo.
No Sssweat
No puedo hacer que este gancho se dispare. Edito un tipo de contenido, hago clic en enviar, pero nada.
Sr. Pablo
7

Esta es otra variación con el uso del gancho que originalmente intentó usar.

Creo que el problema con su código es que intenta cargar una nueva instancia del nodo, pero debe usar el nodo que se proporciona como parámetro $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)
  }
}

Editar:

Se agregó la declaración de uso al código.

4k4
fuente
1
acabo de probar su código, pero está rompiendo el sitio, obteniendo el clásicoThe website encountered an unexpected error. Please try again later.
No Sssweat
1
Este código es solo para demostrar cómo usar el gancho. Necesita las declaraciones de uso correctas. Puede averiguar esto si busca en watchdog (/ admin / reports / dblog).
4k4
1
agregar use Drupal\node\NodeInterface;código ya no rompe automáticamente el sitio, pero después de guardar el nodo, recibo el error 500 como si estuviera recibiendo mi pregunta y los registros no registran nada al respecto.
No Sssweat
1
Solo quería señalar el problema: no cargue una nueva instancia del nodo, sino que use la que se proporciona como parámetro de función. ¿Qué error hay detrás de 500? Verifique sus archivos de registro o active el registro de errores.
4k4
1
Borro el registro, por lo que no me confundo con todos los demás errores anteriores, pero después de guardar y obtener el error varias veces, los archivos de registro están vacíos
sin Sssweat
3

Los títulos en Drupal 8 no se configuran como campos estándar; Tienen su propia función. Úselo $node->setTitle('New Title');para un nodo o $entity->setLabel('New Title');para una entidad genérica. Ver Nodo :: setTitle para más información.

Tom Bisciglia
fuente