Tutorial

EcoMail integration on User Register Event in Drupal 8 / 9

In this case we have two options, either we use hook_user_presave() or we can create new submit handler and use that. 

I picked the second option just because I needed some values from $form_state variable, specifically selected role from Role Expose module. This value was not present in hook_user_presave(), because at the time hook_user_presave() runs, user does not exist yet and transaction is not finished, so he does not have any roles at all. (well, techgnically he has "anonymous" role).

Pridal/a lubo dňa Št, 12/15/2022 - 05:19
Create new submit handler using hook_form_alter()

This code reacts on user_register_form form ID.

function grafeon_custom_form_alter(&$form, &$form_state, $form_id) { 
  if($form_id == 'user_register_form') {
    $form['actions']['submit']['#submit'][] = 'grafeon_custom_ecomail';
  }   
}

 

Use the handler to send values to Ecomail

Well I will just copy-paste the code here and maybe, someone in the future can use it. As I said previously, I was getting role from $form_state array but you can safely remove that.

function grafeon_custom_ecomail($form, $form_state) {
	$user = $form_state->getFormObject()->getEntity();
  
	// ecomail
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, "https://api2.ecomailapp.cz/lists/[LIST_ID]/subscribe"); // Pick your list ID from Ecomail
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_HEADER, FALSE);

	curl_setopt($ch, CURLOPT_POST, TRUE);

	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
	  "key: [YOUR_API_KEY]",
	  "Content-Type: application/json"
	));
	
// This gets the custom values, like pretitle, surname, etc.
	$titul_pred_menom = $user->get('field_titul_pred_menom')->getString();
	$vase_meno = $user->get('field_vase_meno')->getString();
	$vase_priezvisko = $user->get('field_vase_priezvisko')->getString();
	$titul_za_menom = $user->get('field_titul_za_menom')->getString();
	
	$tags = [];
	
// This gets the role from Role Expose module
	$role = $form_state->getValues()["select_roles"];
	
	if($role == "ucitel") {
		array_push($tags,"ucitel");
	}
	else {
		array_push($tags,"student");
	}
	
	$data = json_encode(array(
		"subscriber_data"  => array(
			"pretitle" => $titul_pred_menom,
			"name" => $vase_meno,
			"surname" => $vase_priezvisko,
			"surtitle" => $titul_za_menom,
			"email" => $user->getEmail(),
			"tags" => $tags
		)
	));
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	

	$response = curl_exec($ch);
	curl_close($ch);
  
}

 

Might interest you

Tutorial
In Drupal 7, there was a handy dandy option to just delete the translation from Admin UI. But in Drupal 8, there is no such an option. Also…
Tutorial
Universal way of adding HTTPS only solution to your Drupal 8 installation.

Recommended

Tutorial
1 views
While working on a fairly complex website with very complex views setup, including tens…
Tutorial
6 views
In this case we have two options, either we use hook_user_presave() or we can create new…
Tutorial
4 views
When using Swiftmailer under Drupal 8 / 9 it automatically sets the headers for sender to…
Tutorial
3 views
Yes, IOS / Safari is the new internet explorer. Amount of time I spend on debugging…
Tutorial
10 views
There is a very handy function in Drupal 8 / 9, allowing developers refresh view when…