Drupal 8 CiviCRM 创建用户无效会话密钥

Drupal 8 CiviCRM Create user invalid session key

我有一个自定义模块,我在其中为具有不同角色的 drupal 用户创建自定义注册表单。在我安装 CiviCRM

之前它运行良好

提交表单时,它会显示:

Sorry, due to an error, we are unable to fulfill your request at the moment. You may want to contact your administrator or service provider with more details about what action you were performing when this occurred. We can't load the requested web page. This page requires cookies to be enabled in your browser settings. Please check this setting and enable cookies (if they are not enabled). Then try again. If this error persists, contact the site administrator for assistance.

Site Administrators: This error may indicate that users are accessing this page using a domain or URL other than the configured Base URL. EXAMPLE: Base URL is http://example.org, but some users are accessing the page via http://www.example.org or a domain alias like http://myotherexample.org.

Error type: Could not find a valid session key.

我的代码:

public function submitForm(array &$form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $account = entity_create('user');
    $account->setUsername($form_state->getValue('uname'))->setEmail($form_state->getValue('email'));
    $account->addRole('private');
    $account->activate();
    $account->save();
}

检查了我的 Civi 资源 url,但它们是正确的。

Drupal: 8.4.0

CiviCRM:4.7.28

找到了!

如果您构建自定义表单,Civi 在创建新 Drupal 用户时需要一些字段。

1:转到 Civi 配置文件 (/civicrm/admin/uf/group?reset=1) 和 select 您想要包含在表单中的所需配置文件。我 select 编辑了 "Your registration form"。 转到配置文件的设置和 select "used for => Drupal User Registration" 在高级设置中检查需要创建帐户

2:在您的自定义表单中,实现函数:'civicrm_form_user_register_form_alter'。

public function buildForm(array $form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $validators = array(
        'file_validate_extensions' => array('jpg jpeg png'),
    );
    $form['uname'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Username*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['organisation'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Organisation name*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['password'] = array(
        '#type' => 'password_confirm',
        '#placeholder' => t('Password*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['name'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Full Name*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['email'] = array(
        '#type' => 'email',
        '#placeholder' => t('Email Address*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );

    $form['street'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Street*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['nr'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Nr*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['zipcode'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('Zipcode*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );
    $form['city'] = array(
        '#type' => 'textfield',
        '#placeholder' => t('City*'),
        '#required' => TRUE,
        '#attributes' => array('class' => array('form-control')),
    );

    //This did the trick!
    if( function_exists('civicrm_form_user_register_form_alter') ) {
        civicrm_form_user_register_form_alter($form,$form_state,'customRegistration');
    }

    $form['actions'] = array('#type' => 'actions');
    $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#value' => $this->t('Create'),
        '#attributes' => array('class' => array('btn', 'btn-cs', 'btn-outline')),
    );
    $form['#validate'][] = array($this, 'regValidate');
    return $form;
} 

2:在您的模板中,添加具有来自 Civi 函数的字段名称的字段:

{{custom_registration_form.civicrm_profile_register}}

您在 /modules/civicrm-drupal/civicrm.module

中找到名称
$form['civicrm_profile_register'] = array(
'#markup' => \Drupal\Core\Render\Markup::create($html),
'#cache' => [
  'max-age' => 0,
],

);

配置文件中的字段将包含在您的自定义表单中,会话密钥不再有问题。