Answers:
您需要执行两个步骤:
第一步:自动生成标题和隐藏表格。使用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();
}
}
您可以使用挂钩后动作模块
因此,此模块引入了几个新的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
这可能是一个老问题,但这是我的看法。假设您需要此节点添加文章。
<?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();
}
}