0

我正在开发一个 Drupal 站点,该站点使用对子项和父项内容类型的实体引用对家庭内容类型进行建模。家庭在一个表单中输入,我使用内联实体表单模块 (IEF) 来启用在同一表单中输入父子信息。我的目标是允许匿名用户通过填写​​此表单来创建用户帐户。目前,我有一个自定义模块,它实现了 hook_form_FORM_ID_alter 并向提交操作添加了一个函数,该函数创建了一个新的用户帐户并设置了外部表单节点(在本例中为 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 以便我可以更改所有权,我将不胜感激!

4

1 回答 1

0

我最终找到了解决方案。对于内联表单,直到完整的表单才真正提交内容,所以我可以从外部表单的表单提交钩子上的引用实体中获取 nid:

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();
        }
}
于 2020-09-04T03:02:33.817 回答