Helper/AAMFieldsExtractorHelper.php (132 lines of code) (raw):
<?php
/**
* Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
*/
namespace Facebook\BusinessExtension\Helper;
use FacebookAds\Object\ServerSide\Normalizer;
use FacebookAds\Object\ServerSide\Util;
/**
* Helper to extract and filter aam fields
*/
class AAMFieldsExtractorHelper
{
/**
* @var MagentoDataHelper
*/
protected $magentoDataHelper;
/**
* @var FBEHelper
*/
protected $fbeHelper;
/**
* Constructor
* @param MagentoDataHelper $magentoDataHelper
* @param FBEHelper $fbeHelper
*/
public function __construct(
MagentoDataHelper $magentoDataHelper,
FBEHelper $fbeHelper
) {
$this->magentoDataHelper = $magentoDataHelper;
$this->fbeHelper = $fbeHelper;
}
/**
* Filters user data according to AAM settings and normalizes the fields
* Reads user data from session when no user data was passed
* @param string[] $userDataArray
* @return string[]
*/
public function getNormalizedUserData($userDataArray = null)
{
if (!$userDataArray) {
$userDataArray = $this->magentoDataHelper->getUserDataFromSession();
}
$aamSettings = $this->fbeHelper->getAAMSettings();
if (!$userDataArray || !$aamSettings || !$aamSettings->getEnableAutomaticMatching()) {
return null;
}
//Removing fields not enabled in AAM settings
foreach ($userDataArray as $key => $value) {
if (!in_array($key, $aamSettings->getEnabledAutomaticMatchingFields())) {
unset($userDataArray[$key]);
}
}
// Normalizing gender and date of birth
// According to https://developers.facebook.com/docs/facebook-pixel/advanced/advanced-matching
if (array_key_exists(AAMSettingsFields::GENDER, $userDataArray)
&& !empty($userDataArray[AAMSettingsFields::GENDER])
) {
$userDataArray[AAMSettingsFields::GENDER] = $userDataArray[AAMSettingsFields::GENDER][0];
}
if (array_key_exists(AAMSettingsFields::DATE_OF_BIRTH, $userDataArray)
) {
// strtotime() and date() return false for invalid parameters
$unixTimestamp = strtotime($userDataArray[AAMSettingsFields::DATE_OF_BIRTH]);
if (!$unixTimestamp) {
unset($userDataArray[AAMSettingsFields::DATE_OF_BIRTH]);
} else {
$formattedDate = date("Ymd", $unixTimestamp);
if (!$formattedDate) {
unset($userDataArray[AAMSettingsFields::DATE_OF_BIRTH]);
} else {
$userDataArray[AAMSettingsFields::DATE_OF_BIRTH] = $formattedDate;
}
}
}
// Given that the format of advanced matching fields is the same in
// the Pixel and the Conversions API,
// we can use the business sdk for normalization
// Compare the documentation:
// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters
// https://developers.facebook.com/docs/facebook-pixel/advanced/advanced-matching
foreach ($userDataArray as $field => $data) {
try {
$normalizedValue = Normalizer::normalize($field, $data);
$userDataArray[$field] = $normalizedValue;
} catch (\Exception $e) {
unset($userDataArray[$field]);
}
}
return $userDataArray;
}
/**
* @param $event
* @param null $userDataArray
* @return mixed
*/
public function setUserData($event, $userDataArray = null)
{
$userDataArray = self::getNormalizedUserData($userDataArray);
if (empty($userDataArray)) {
return $event;
}
$userData = $event->getUserData();
if (array_key_exists(AAMSettingsFields::EMAIL, $userDataArray)
) {
$userData->setEmail(
$userDataArray[AAMSettingsFields::EMAIL]
);
}
if (array_key_exists(AAMSettingsFields::FIRST_NAME, $userDataArray)
) {
$userData->setFirstName(
$userDataArray[AAMSettingsFields::FIRST_NAME]
);
}
if (array_key_exists(AAMSettingsFields::LAST_NAME, $userDataArray)
) {
$userData->setLastName(
$userDataArray[AAMSettingsFields::LAST_NAME]
);
}
if (array_key_exists(AAMSettingsFields::GENDER, $userDataArray)
) {
$userData->setGender(
$userDataArray[AAMSettingsFields::GENDER]
);
}
if (array_key_exists(AAMSettingsFields::DATE_OF_BIRTH, $userDataArray)
) {
$userData->setDateOfBirth($userDataArray[AAMSettingsFields::DATE_OF_BIRTH]);
}
if (array_key_exists(AAMSettingsFields::EXTERNAL_ID, $userDataArray)
) {
$userData->setExternalId(
Util::hash($userDataArray[AAMSettingsFields::EXTERNAL_ID])
);
}
if (array_key_exists(AAMSettingsFields::PHONE, $userDataArray)
) {
$userData->setPhone(
$userDataArray[AAMSettingsFields::PHONE]
);
}
if (array_key_exists(AAMSettingsFields::CITY, $userDataArray)
) {
$userData->setCity(
$userDataArray[AAMSettingsFields::CITY]
);
}
if (array_key_exists(AAMSettingsFields::STATE, $userDataArray)
) {
$userData->setState(
$userDataArray[AAMSettingsFields::STATE]
);
}
if (array_key_exists(AAMSettingsFields::ZIP_CODE, $userDataArray)
) {
$userData->setZipCode(
$userDataArray[AAMSettingsFields::ZIP_CODE]
);
}
if (array_key_exists(AAMSettingsFields::COUNTRY, $userDataArray)
) {
$userData->setCountryCode(
$userDataArray[AAMSettingsFields::COUNTRY]
);
}
return $event;
}
}