Same accepted answer: https://stackoverflow.com/a/51280077/4329215
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.