Come incorporare il NID di un nodo nel titolo di un nodo?


8

So che esiste il modulo Automatic Nodetitles , ma è solo per Drupal 7.

Esiste un metodo per assegnare automaticamente il titolo con il NID facendo clic su Invia? So che il NID non esiste fino a quando non viene premuto il pulsante di invio. Come si potrebbe incorporare il NID nel titolo?

Quale gancio si userebbe?


Hai provato Auto EntityLabel per D8? Esiste un ramo di sviluppo. Hai provato anche le regole?
Kevin

@Kevin purtroppo, la regola 8 è MIA.
No Sssweat,

Risposte:


5

Devi fare due passaggi:

Fase 1: generare automaticamente il titolo e la forma nascosta. usa hook_field_widget_form_alter () con il codice

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 il primo passaggio è possibile incrociare il modulo di invio.

Passaggio 2: sovrascrivere il nuovo titolo con il valore predefinito. Usa 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();  
  }
}

2
Se ha il nid, che è l'unica informazione disponibile solo dopo il salvataggio, allora questo è il modo giusto. Qualcos'altro, come la data o qualcosa del genere, sarebbe possibile dal gancio di salvataggio, che sarebbe più veloce in quanto non dovresti salvare nuovamente due volte. Se ne hai davvero bisogno, dovresti anche aggiungere un segno di spunta per assicurarti che il titolo non sia quello predefinito.
Berdir,

1

È possibile utilizzare il modulo Hook Post Action

Quindi questo modulo introduce diversi nuovi hook Drupal per superare questa limitazione

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

e uno che lo ha installato è possibile utilizzare il hook_node_postsave() gancio

Nella pagina del modulo Nodetitles automatici dice:

Si informa che esiste un'alternativa meglio mantenuta disponibile: https://www.drupal.org/project/auto_entitylabel


0

Questo potrebbe essere un vecchio problema, ma ecco la mia opinione. Supponiamo che tu abbia bisogno di questo per aggiungere un articolo al nodo.

<?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();
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.