session-cookiesdrupal-8civicrmcreateuser

Drupal 8 CiviCRM Create user invalid session key


I have a custom module where i create custom registration forms for drupal users with different roles. It was working good till i installed CiviCRM

When a form is submitted, it says:

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.

My code:

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();
}

Checked for my Resource urls for Civi but they are correct.

Drupal: 8.4.0

CiviCRM: 4.7.28


Solution

  • Found it!

    If you build a custom form, Civi need some fields for when a new Drupal user is created.

    1: Go to Civi profiles (/civicrm/admin/uf/group?reset=1) and select the desired profile you want to include in the form. I selected "Your registration form". Go to settings of the profile and select "used for => Drupal User Registration" In Advanced Settings check Account creation required

    2: In your custom form, implement the function: '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: In your template, add the fields with the field name from the Civi function:

    {{custom_registration_form.civicrm_profile_register}}
    

    You find the name in /modules/civicrm-drupal/civicrm.module

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

    );

    The fields from the profile will be included in your custom form and no problems with sessions key anymore.