¿Cómo incrustar el NID de un nodo en el título de un nodo?

8

Sé que el módulo de nodos automáticos existe, pero es solo para Drupal 7.

¿Existe un método para asignar automáticamente el título con el NID al hacer clic en enviar? Sé que el NID no existe hasta que se presiona el botón Enviar. ¿Cómo se incrustaría el NID en el título?

¿Qué gancho usaría uno?

Patoshi パ ト シ
fuente
¿Has probado Auto EntityLabel para D8? Existe una rama de desarrollo. ¿También has probado las reglas?
Kevin
@Kevin desafortunadamente, las Reglas 8 son MIA.
No Sssweat

Respuestas:

5

Necesitas hacer dos pasos:

Paso uno: generar automáticamente el título y la forma oculta. use hook_field_widget_form_alter () con el código

function MY_MODULE_field_widget_form_alter(&$element, \Drupal\Core\Form\FormStateInterface $form_state, $context) {
  $field_definition = $context['items']->getFieldDefinition();
  $bundle = $form_state->getFormObject()->getEntity()->bundle();
  // You can check with other bundle
  if ($field_definition->getName() == 'title' && $bundle == 'page' && $element['value']['#default_value'] == '') {
    $element['#required'] = FALSE;
    //hidden title  
    $element['#type'] = 'hidden';
    $element['value']['#required'] = FALSE;
    // Set default value
    $element['value']['#default_value'] = 'Default Title';
  }
}

con el paso uno puede cruzar el formulario de envío.

Paso dos: anula el nuevo título con el valor predeterminado. Utilice hook_node_insert ()

function MY_MODULE_node_insert(Drupal\node\NodeInterface $node) {
  if ($node->bundle() == 'page') {
    $new_title = 'New title ' . $node->id();
    $node->setTitle($new_title);
    $node->setNewRevision(FALSE);
    $node->save();  
  }
}
MrD
fuente
2
Si tiene el nid, que es la única información solo disponible después de guardar, entonces esta es la forma correcta. Cualquier otra cosa, como la fecha o algo así, sería posible desde el gancho de pre-guardado, que sería más rápido ya que no tendría que volver a guardar dos veces. Si realmente necesita esto, también debe agregar una marca de verificación para asegurarse de que el título no sea el predeterminado.
Berdir
1

Puede usar el módulo Hook Post Action

Entonces, este módulo presenta varios nuevos ganchos Drupal para superar esta limitación

  • hook_entity_postsave
  • hook_entity_postinsert
  • hook_entity_postupdate
  • hook_entity_postdelete
  • hook_node_postsave
  • hook_node_postinsert
  • hook_node_postupdate
  • hook_node_postdelete

y una vez que lo tengas instalado puedes usar el hook_node_postsave()gancho

En la página del módulo Automatic Nodetitles dice:

Tenga en cuenta que hay una alternativa mejor mantenida disponible: https://www.drupal.org/project/auto_entitylabel

Adrian Cid Almaguer
fuente
0

Este puede ser un problema antiguo, pero aquí está mi opinión. Digamos que necesita esto para el nodo agregar artículo.

<?php

use Drupal\Core\Form\FormStateInterface;
use Drupal\node\NodeInterface;

function MYMODULE_form_node_article_form_alter(&$form, FormStateInterface $form_state, $form_id) {

    // Hide title field to avoid confusion
    $form['title']['#access'] = FALSE;
    // Set a temporary title because it's always required on node save.
    $form['title']['widget'][0]['value']['#default_value'] = 'Dummy title';

}

function MYMODULE_node_insert(NodeInterface $node) {
  if ($node->bundle() == 'article') {
    $new_title = 'Title ' . $node->id();
    $node->setTitle($new_title);
    $node->setNewRevision(FALSE);
    $node->save();
  }
}
JF Kiwad
fuente