如何解决是否可以通过表单更改钩子访问在Drupal 8中使用内联实体表单创建的节点?
我正在一个Drupal站点上,该站点使用对Childs和Parent内容类型的实体引用对Family内容类型进行建模。家庭是以单一形式输入的,我正在使用内联实体表单模块(IEF)来启用以相同形式输入父级和子级信息。我的目标是允许匿名用户通过填写此表单来创建用户帐户。当前,我有一个自定义模块,该模块实现hook_form_FORM_ID_alter并向Submit操作添加一个函数,该函数创建一个新用户帐户并设置外部表单节点(在这种情况下为Family节点)的所有者:
function myModule_form_node_family_form_alter(&$form,&$form_state,$form_id){
#register function on submit as that's when the node id of the created entity is available
$form['actions']['submit']['#submit'][] = 'signup_submit';
}
function signup_submit($form,&$form_state){
#get node id of newly created entity
$nid = $form_state->getValue('nid');
#create user
$email = $form_state->getValue('field_email_address')[0]['value'];
$user = \Drupal\user\Entity\User::create();
$user->setEmail($email);
$user->enforceIsNew();
$user->setPassword(getRandomPassword());
$user->setUsername(genUsername($nid));
if($res){
#set user to be owner of newly created node
dpm("User ".$user->id()."created successfully!");
$node = node_load($nid);
$node->setOwner($user);
$node->save();
}
}
我希望对使用类似模式的IEF创建的节点执行相同的操作:
function myModule_inline_entity_form_entity_form_alter(&$entity_form,&$form_state){
$entity_form['actions']['submit']['#submit'][] = 'inline_submit';
}
function inline_submit(&$entity_form,&$form_state){
$nid = $form_state->getValue('nid');
dpm("nid of inline entity: ".$nid);
}
...但是它似乎不起作用。如果有人知道何时真正创建节点以及如何访问节点ID以便更改所有权,我将不胜感激!
解决方法
我最终找到了解决方案。对于内联表单,内容只有在完整表单提交后才真正提交,因此我可以从外部表单的表单提交钩子上从引用的实体中获取图片:
function myModule_form_node_FORM_ID_alter(&$form,&$form_state,$form_id){
#register my on_submit callback
$form['actions']['submit']['#submit'][] = 'myModule_form_submit';
}
function myModule_form_submit($form,&$form_state){
$fnode = $form_state->getFormObject()->getEntity();
#in my case the field was a multiple entity reference,so loop over each created node
foreach($fnode->field_children->referencedEntities() as $cnode){
# do stuff with the child node in $cnode
$cnode->save();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。