Comment intégrer le NID d'un nœud dans le titre d'un nœud?

8

Je sais que le module Automatic Nodetitles existe, mais ce n'est que pour Drupal 7.

Existe-t-il une méthode pour attribuer automatiquement le titre au NID lorsque vous cliquez sur Soumettre? Je sais que le NID n'existe pas tant que le bouton d'envoi n'a pas été touché. Comment intégrer le NID dans le titre?

Quel crochet utiliserait-on?

Patoshi パ ト シ
la source
Avez-vous essayé Auto EntityLabel pour D8? Il existe une branche de développement. Avez-vous également essayé Rules?
Kevin
@Kevin malheureusement, les règles 8 sont MIA.
Pas de Sssweat

Réponses:

5

Vous devez faire deux étapes:

Première étape: générer automatiquement le titre et le formulaire masqué. utilisez hook_field_widget_form_alter () avec le code

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';
  }
}

avec la première étape, vous pouvez traverser le formulaire de soumission.

Deuxième étape: remplacer le nouveau titre par la valeur par défaut. Utilisez 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
la source
2
S'il a le nid, qui est la seule information disponible uniquement après l'enregistrement, c'est la bonne façon. Tout autre chose, comme la date ou quelque chose comme ça, serait possible à partir du crochet préenregistré, ce qui serait plus rapide car vous n'auriez pas à réenregistrer deux fois. Si vous en avez vraiment besoin, vous devez également ajouter une vérification pour vous assurer que le titre n'est pas celui par défaut.
Berdir
1

Vous pouvez utiliser le module Hook Post Action

Donc, ce module présente plusieurs nouveaux crochets Drupal pour surmonter cette limitation

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

et celui que vous l'avez installé, vous pouvez utiliser le hook_node_postsave()crochet

Dans la page du module Automatic Nodetitles, on peut lire:

Soyez avisé qu'une alternative mieux entretenue est disponible: https://www.drupal.org/project/auto_entitylabel

Adrian Cid Almaguer
la source
0

C'est peut-être un ancien problème, mais voici mon point de vue. Disons que vous en avez besoin pour ajouter un article.

<?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
la source