Как встроить NID узла в заголовок узла?

8

Я знаю, что модуль Automatic Nodetitles существует, но он только для Drupal 7.

Существует ли способ автоматического назначения заголовка с помощью NID при нажатии кнопки «Отправить»? Я знаю, что NID не существует, пока не нажата кнопка отправки. Как можно вставить NID в заголовок?

Какой крюк можно использовать?

Патоши パ ト シ
источник
Вы пробовали Auto EntityLabel для D8? Ветвь разработчика существует. Вы также пробовали Правила?
Кевин
@Kevin, к сожалению, Правила 8 - это МВД.
Нет Sssweat

Ответы:

5

Вам нужно сделать два шага:

Шаг первый: автоматически сгенерировать заголовок и скрытую форму. использовать hook_field_widget_form_alter () с кодом

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

с первого шага вы можете отправить форму.

Шаг второй: переопределить новый заголовок значением по умолчанию. Используйте 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
источник
2
Если у него есть nid, который является единственной информацией, доступной только после сохранения, то это правильный путь. Все что угодно, например дата или что-то в этом роде, можно было бы сделать с помощью preave-ловушки, что было бы быстрее, так как вам не нужно было бы повторное сохранение дважды. Если вам это действительно нужно, вы также должны добавить флажок, чтобы убедиться, что заголовок не по умолчанию.
Бердир
1

Вы можете использовать модуль Hook Post Action

Таким образом, этот модуль представляет несколько новых хуков Drupal для преодоления этого ограничения.

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

и тот, который у вас есть, вы можете использовать hook_node_postsave()крюк

На странице модуля « Автоматические узлы » говорится:

Имейте в виду, что существует лучшая поддерживаемая альтернатива: https://www.drupal.org/project/auto_entitylabel

Адриан Сид Альмагер
источник
0

Это может быть старая проблема, но вот мое мнение. Допустим, вам это нужно для добавления узла в статью.

<?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
источник