如何解决创建节点时应已填充正文字段
我希望在创建节点时已经填充了 bodyfield。不幸的是,这是 html 中的大量文本,因此我无法使用 https://www.drupal.org/project/prepopulate 模块解决此问题。
但我想为此构建一个小型迷你模块。我想通过 nid 从另一个节点拖动内容并将其复制到我正在创建的节点的 body 字段中。
为此,我想使用 hook_entity_create 钩子。我基本上正确吗?我的程序目前是这样的:
<?php
use Drupal\node\NodeInterface;
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_ENTITY_TYPE_prepare_form() for node entities.
*/
function copy_fields_from_model_contract_node_create_node_create(NodeInterface $node)
{
//TODO Build NID as array and go through with loop
$nid = 6766;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
if ($nid == '6766') {
$getcontract = $node->field_vertragsinhalt->value;
}
//TODO Works without ($operation == 'default')
if ($node->getType() == 'mustervertrage') {
/*dpm ($node->field_vertragsinhalt->value);*/
//TODO Shall always pull the current node and nid. But does not work yet with node creation. Error: Call to a member function id() on null in
$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->id();
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $node_storage->load($nid);
dpm($nid);
$node->field_vertragsinhalt->value = $getcontract;
$node->body->format = 'full_html';
// don't save the node yet,it will be saved after submitting
}
}
然后我收到以下错误:
Error: Call to a member function id() on null in copy_fields_from_model_contract_node_create() (line 29 of modules/custom/copy_fields_from_model_contract_node_create/copy_fields_from_model_contract_node_create.module).
但这意味着在创建节点的那一刻还没有ID,对吧?但是我怎么能在该领域写作,我是否忽略了一些东西。所以钩子似乎有效,但我如何在那里获取我的内容?
谢谢巴夫拉
解决方法
如果您使用 hook_entity_create()
或 hook_ENTITY_TYPE_create()
,$node->id()
将为空,因为这些钩子在节点实际保存到数据库之前被调用。
您应该使用 hook_ENTITY_TYPE_insert()
,它在节点保存后调用:
/**
* Implements hook_ENTITY_TYPE_insert()
*/
function <your_module>_node_insert(NodeInterface $node) {
if (<some conditions to get the node you want>) {
// your logic
$node->save();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。