如何在节点标题中嵌入节点的NID?


8

我知道存在自动节点标题模块,但是仅适用于Drupal 7。

单击提交后,是否可以使用NID自动分配标题?我知道在单击提交按钮之前NID不存在。如何将NID嵌入标题中?

一个钩子会用什么?


您是否尝试过D8的Auto EntityLabel?开发分支存在。您是否也尝试过规则?
凯文

@Kevin不幸的是,规则8是MIA。
没有Sssweat

Answers:


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();  
  }
}

2
如果它具有nid,这是保存后唯一可用的信息,那么这是正确的方法。通过presave钩子可以进行其他任何事情,例如日期或类似的东西,因为您不必重新保存两次,所以速度更快。如果确实需要此功能,则还应添加检查以确保标题不是默认标题。
贝尔迪尔

1

您可以使用挂钩后动作模块

因此,此模块引入了几个新的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();
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.