Helper/MagentoDataHelper.php (293 lines of code) (raw):
<?php
/**
* Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
*/
namespace Facebook\BusinessExtension\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\ObjectManagerInterface;
/**
* Helper class to get data using Magento Platform methods.
*/
class MagentoDataHelper extends AbstractHelper
{
/**
* @var \Magento\Framework\ObjectManagerInterface
*/
protected $objectManager;
/**
* @var \Facebook\BusinessExtension\Logger\Logger
*/
protected $logger;
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $productFactory;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Customer\Api\CustomerMetadataInterface
*/
protected $customerMetadata;
/**
* @var \Magento\Catalog\Api\ProductRepositoryInterface
*/
protected $productRepository;
/**
* MagentoDataHelper constructor
*
* @param Context $context
* @param ObjectManagerInterface $objectManager
* @param \Facebook\BusinessExtension\Logger\Logger $logger
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param \Magento\Customer\Api\CustomerMetadataInterface $customerMetadata
*/
public function __construct(
Context $context,
ObjectManagerInterface $objectManager,
\Facebook\BusinessExtension\Logger\Logger $logger,
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Customer\Api\CustomerMetadataInterface $customerMetadata,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
parent::__construct($context);
$this->objectManager = $objectManager;
$this->logger = $logger;
$this->productFactory = $productFactory;
$this->storeManager = $storeManager;
$this->customerMetadata = $customerMetadata;
$this->productRepository = $productRepository;
}
/**
* Return currently logged in users's email.
*
* @return string
*/
public function getEmail()
{
$currentSession = $this->objectManager->get(\Magento\Customer\Model\Session::class);
return $currentSession->getCustomer()->getEmail();
}
/**
* Return currently logged in users' First Name.
*
* @return string
*/
public function getFirstName()
{
$currentSession = $this->objectManager->get(\Magento\Customer\Model\Session::class);
return $currentSession->getCustomer()->getFirstname();
}
/**
* Return currently logged in users' Last Name.
*
* @return string
*/
public function getLastName()
{
$currentSession = $this->objectManager->get(\Magento\Customer\Model\Session::class);
return $currentSession->getCustomer()->getLastname();
}
/**
* Return currently logged in users' Date of Birth.
*
* @return string
*/
public function getDateOfBirth()
{
$currentSession = $this->objectManager->get(Magento\Customer\Model\Session::class);
return $currentSession->getCustomer()->getDob();
}
/**
* Return the product with the given sku
*
* @param string $productSku
* @return \Magento\Catalog\Model\Product
*/
public function getProductWithSku($productSku)
{
$product = $this->productRepository->get($productSku);
return $product;
}
/**
* Return the categories for the given product
*
* @param \Magento\Catalog\Model\Product $product
* @return string
*/
public function getCategoriesForProduct($product)
{
$categoryIds = $product->getCategoryIds();
if (count($categoryIds) > 0) {
$categoryNames = [];
$categoryModel = $this->objectManager->get(\Magento\Catalog\Model\Category::class);
foreach ($categoryIds as $categoryId) {
$category = $categoryModel->load($categoryId);
$categoryNames[] = $category->getName();
}
return addslashes(implode(',', $categoryNames));
} else {
return null;
}
}
/**
* Return the price for the given product
*
* @param \Magento\Catalog\Model\Product $product
* @return int
*/
public function getValueForProduct($product)
{
$price = $product->getFinalPrice();
$priceHelper = $this->objectManager->get(\Magento\Framework\Pricing\Helper\Data::class);
return $priceHelper->currency($price, false, false);
}
/**
* Return the currency used in the store
*
* @return string
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getCurrency()
{
return $this->storeManager->getStore()->getCurrentCurrency()->getCode();
}
/**
* Return the ids of the items added to the cart
* @return string[]
*/
public function getCartContentIds()
{
$productIds = [];
$cart = $this->objectManager->get(\Magento\Checkout\Model\Cart::class);
if (!$cart || !$cart->getQuote()) {
return null;
}
$items = $cart->getQuote()->getAllVisibleItems();
foreach ($items as $item) {
$product = $item->getProduct();
$productIds[] = $product->getId();
}
return $productIds;
}
/**
* Return the cart total value
* @return int
*/
public function getCartTotal()
{
$cart = $this->objectManager->get(\Magento\Checkout\Model\Cart::class);
if (!$cart || !$cart->getQuote()) {
return null;
}
$subtotal = $cart->getQuote()->getSubtotal();
if ($subtotal) {
$priceHelper = $this->objectManager->get(\Magento\Framework\Pricing\Helper\Data::class);
return $priceHelper->currency($subtotal, false, false);
} else {
return null;
}
}
/**
* Return the amount of items in the cart
* @return int
*/
public function getCartNumItems()
{
$cart = $this->objectManager->get(\Magento\Checkout\Model\Cart::class);
if (!$cart || !$cart->getQuote()) {
return null;
}
$numItems = 0;
$items = $cart->getQuote()->getAllVisibleItems();
foreach ($items as $item) {
$numItems += $item->getQty();
}
return $numItems;
}
/**
* Return information about the cart items
* @return array
*/
public function getCartContents()
{
$cart = $this->objectManager->get(\Magento\Checkout\Model\Cart::class);
if (!$cart || !$cart->getQuote()) {
return null;
}
$contents = [];
$items = $cart->getQuote()->getAllVisibleItems();
$priceHelper = $this->objectManager->get(\Magento\Framework\Pricing\Helper\Data::class);
foreach ($items as $item) {
$product = $item->getProduct();
$contents[] = [
'product_id' => $product->getId(),
'quantity' => $item->getQty(),
'item_price' => $priceHelper->currency($product->getFinalPrice(), false, false)
];
}
return $contents;
}
/**
* Return the ids of the items in the last order
* @return string[]
*/
public function getOrderContentIds()
{
$order = $this->objectManager->get(\Magento\Checkout\Model\Session::class)->getLastRealOrder();
if (!$order) {
return null;
}
$productIds = [];
$items = $order->getAllVisibleItems();
foreach ($items as $item) {
$product = $item->getProduct();
$productIds[] = $product->getId();
}
return $productIds;
}
/**
* Return the last order total value
* @return string
*/
public function getOrderTotal()
{
$order = $this->objectManager->get(\Magento\Checkout\Model\Session::class)->getLastRealOrder();
if (!$order) {
return null;
}
$subtotal = $order->getSubTotal();
if ($subtotal) {
$priceHelper = $this->objectManager->get(\Magento\Framework\Pricing\Helper\Data::class);
return $priceHelper->currency($subtotal, false, false);
} else {
return null;
}
}
/**
* Return information about the last order items
*
* @return array
*/
public function getOrderContents()
{
$order = $this->objectManager->get(\Magento\Checkout\Model\Session::class)->getLastRealOrder();
if (!$order) {
return null;
}
$contents = [];
$items = $order->getAllVisibleItems();
$priceHelper = $this->objectManager->get(\Magento\Framework\Pricing\Helper\Data::class);
foreach ($items as $item) {
$product = $item->getProduct();
$contents[] = [
'product_id' => $product->getId(),
'quantity' => (int)$item->getQtyOrdered(),
'item_price' => $priceHelper->currency($product->getFinalPrice(), false, false)
];
}
return $contents;
}
/**
* Return the id of the last order
*
* @return int
*/
public function getOrderId()
{
$order = $this->objectManager->get(\Magento\Checkout\Model\Session::class)->getLastRealOrder();
if (!$order) {
return null;
} else {
return $order->getId();
}
}
/**
* Return an object representing the current logged in customer
*
* @return \Magento\Customer\Model\Customer
*/
public function getCurrentCustomer()
{
$session = $this->objectManager->create(\Magento\Customer\Model\Session::class);
if (!$session->isLoggedIn()) {
return null;
} else {
return $session->getCustomer();
}
}
/**
* Return the address of a given customer
*
* @return \Magento\Customer\Model\Address
*/
public function getCustomerAddress($customer)
{
$customerAddressId = $customer->getDefaultBilling();
$address = $this->objectManager->get(\Magento\Customer\Model\Address::class);
$address->load($customerAddressId);
return $address;
}
/**
* Return the region's code for the given address
*
* @return array
*/
public function getRegionCodeForAddress($address)
{
$region = $this ->objectManager->get(\Magento\Directory\Model\Region::class)
->load($address->getRegionId());
if ($region) {
return $region->getCode();
} else {
return null;
}
}
/**
* Return the string representation of the customer gender
*
* @return string
*/
public function getGenderAsString($customer)
{
if ($customer->getGender()) {
return $customer->getResource()->getAttribute('gender')->getSource()->getOptionText($customer->getGender());
}
return null;
}
/**
* Return all of the match keys that can be extracted from order information
*
* @return string[]
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getUserDataFromOrder()
{
$order = $this->objectManager->get(\Magento\Checkout\Model\Session::class)->getLastRealOrder();
if (!$order) {
return null;
}
$userData = [];
$userData[AAMSettingsFields::EXTERNAL_ID] = $order->getCustomerId();
$userData[AAMSettingsFields::EMAIL] = $this->hashValue($order->getCustomerEmail());
$userData[AAMSettingsFields::FIRST_NAME] = $this->hashValue($order->getCustomerFirstname());
$userData[AAMSettingsFields::LAST_NAME] = $this->hashValue($order->getCustomerLastname());
$userData[AAMSettingsFields::DATE_OF_BIRTH] = $this->hashValue($order->getCustomerDob());
if ($order->getCustomerGender()) {
$genderId = $order->getCustomerGender();
$userData[AAMSettingsFields::GENDER] =
$this->hashValue(
$this->customerMetadata->getAttributeMetadata('gender')
->getOptions()[$genderId]->getLabel()
);
}
$billingAddress = $order->getBillingAddress();
if ($billingAddress) {
$userData[AAMSettingsFields::ZIP_CODE] = $this->hashValue($billingAddress->getPostcode());
$userData[AAMSettingsFields::CITY] = $this->hashValue($billingAddress->getCity());
$userData[AAMSettingsFields::PHONE] = $this->hashValue($billingAddress->getTelephone());
$userData[AAMSettingsFields::STATE] = $this->hashValue($billingAddress->getRegionCode());
$userData[AAMSettingsFields::COUNTRY] = $this->hashValue($billingAddress->getCountryId());
}
return array_filter($userData);
}
/**
* Return all of the match keys that can be extracted from user session
*
* @return string[]
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getUserDataFromSession()
{
$customer = $this->getCurrentCustomer();
if (!$customer) {
return null;
}
$userData = [];
$userData[AAMSettingsFields::EXTERNAL_ID] = $customer->getId();
$userData[AAMSettingsFields::EMAIL] = $this->hashValue($customer->getEmail());
$userData[AAMSettingsFields::FIRST_NAME] = $this->hashValue($customer->getFirstname());
$userData[AAMSettingsFields::LAST_NAME] = $this->hashValue($customer->getLastname());
$userData[AAMSettingsFields::DATE_OF_BIRTH] = $this->hashValue($customer->getDob());
if ($customer->getGender()) {
$genderId = $customer->getGender();
$userData[AAMSettingsFields::GENDER] =
$this->hashValue(
$this->customerMetadata->getAttributeMetadata('gender')
->getOptions()[$genderId]->getLabel()
);
}
$billingAddress = $this->getCustomerAddress($customer);
if ($billingAddress) {
$userData[AAMSettingsFields::ZIP_CODE] = $this->hashValue($billingAddress->getPostcode());
$userData[AAMSettingsFields::CITY] = $this->hashValue($billingAddress->getCity());
$userData[AAMSettingsFields::PHONE] = $this->hashValue($billingAddress->getTelephone());
$userData[AAMSettingsFields::STATE] = $this->hashValue($billingAddress->getRegionCode());
$userData[AAMSettingsFields::COUNTRY] = $this->hashValue($billingAddress->getCountryId());
}
return array_filter($userData);
}
private function hashValue($string){
return hash('sha256', strtolower($string));
}
// TODO Remaining user/custom data methods that can be obtained using Magento.
}