Modificar la fecha de creación de un nodo al publicarse en Drupal 8

Escrito por Rafa Morales el 11 Junio 2020
Modificar la fecha de creación de un nodo al publicarse en Drupal 8

La fecha de creación de un nodo (de cualquier tipo de contenido) en Drupal es única y corresponde con el momento en que guardamos el nodo por primera vez. Si trabajamos con los estados borrador y publicado, esta fecha no se modificará una vez que pasemos el node de borrador a publicado.

¿Y por qué necesitamos modificarla? En mi caso, ordeno los nodos en la portada y en las taxonomías en función de la fecha de creación, pero puedo estar escribiendo varios contenidos al mismo tiempo mientras los tengo en borrador, o tardar unas semanas en publicar los contenidos, de ahí que no puedo trabajar con la primera fecha de creación. ¿Y por qué no utilizar la fecha de modificación? Porque suelo modificar los contenidos para mejorarlos y no quiero que se me desordenen.

Todo esto lo combino trabajando con el estado borrador hasta que paso el contenido al estado publicado, por lo que necesito que una vez que el contenido pase a publicado sea la fecha de creación.

Por ahora sólo he hecho pruebas con las revisiones y no he tenido problema por modificar la fecha de creación, pero ya veremos en un futuro si no me encuentro ningún otro problema por ello.

Esta actualización la voy a realizar en el hook_entity_presave() antes de que el nodo se guarde, comparando el nodo original con el modificado para ver si el estado de moderación ha pasado a publicado.

En el siguiente código podéis ver cómo podríamos solucionarlo:

/**
 * @see hook_entity_presave
 */
function mymodule_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  switch ($entity->bundle()) {
    case 'page':
      if (!empty($entity->original)) {
        if ($entity->get('moderation_state')->getString() == 'published' && 
            $entity->original->get('moderation_state')->getString() == 'draft') {
          $entity->set('created', time());
          \Drupal::messenger()->addMessage(t('%title has been published and its created date has been updated.', 
                                               ['%title' => $entity->toLink()->toString()]), 'status');
        }
      }
      break;
  }
}

 

Bibliografía

  • Adjusting a node's published time when publishing through content moderation. Glamanate.com