This is why I never use third party public extension. You have no idea what they actually do under the hood.
I have created a private extension to do this but I think you can do this as custom javascript code. (done this before doing private extensions).
Ok first we will create a helper to getObjectProperty at a specific location. Won't avoid you to do the chained validation if specific location exist then check next location exist etc.. (ps: directly ported from core library as they do not expose it as shared module)
/**
* Returns the deep property value of an object.
* @param {Object} obj The object where the property will be searched.
* @param {String} property The property name to be returned. It can contain dots. (eg. prop.subprop1)
* @returns {*}
*/
function getObjectProperty(obj, property) {
var propertyChain = property ? property.split('.') : [];
var currentValue = obj;
for (var i = 0, len = propertyChain.length; i < len; i++) {
if (currentValue == null) {
return undefined;
}
currentValue = currentValue[propertyChain[i]];
}
return currentValue;
};
Ok now you can create this code in your data element to get the product details.
/**
* Build the product string in Adobe Analytics format.
* Grabs product details from the data layer
* @param {Object} event Direct Call rule event details
* @returns {String} products value in Adobe Analytics s.products format
*/
function getProductsDetails(event) {
try {
var pathToTransationItems = 'digitalData.transaction.item';
var pathToProductName = 'productInfo.productName';
var productsArray = getObjectProperty(window, pathToTransationItems);
var productString = '';
if (productsArray && productsArray.length > 0) {
for (var i = 0; i < productsArray.length; i++) {
var product = productsArray[i];
var value = ';' + getObjectProperty(product, pathToProductName );
productString += (i == 0) ? value : ',' + value;
}
}
return productString;
} catch (e) {
_satellite.logger.error('Failed to get product details -- ', e);
}
}
And then simply add
try {
return getProductsDetails();
} catch (e) {
_satellite.logger.error('Failed to get product details', e);
}
I would advise you to consider deploying you own private extension. Check out my dev.to page as auto-tagging is in progress https://dev.to/alcazes