Controller/Pixel/ProductInfoForAddToCart.php (88 lines of code) (raw):
<?php
/**
* Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
*/
namespace Facebook\BusinessExtension\Controller\Pixel;
use Facebook\BusinessExtension\Helper\EventIdGenerator;
use Facebook\BusinessExtension\Helper\FBEHelper;
class ProductInfoForAddToCart extends \Magento\Framework\App\Action\Action
{
protected $_resultJsonFactory;
protected $_productFactory;
protected $_fbeHelper;
protected $_formKeyValidator;
protected $_magentoDataHelper;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Catalog\Model\ProductFactory $productFactory,
FBEHelper $helper,
\Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
\Facebook\BusinessExtension\Helper\MagentoDataHelper $magentoDataHelper
) {
parent::__construct($context);
$this->_resultJsonFactory = $resultJsonFactory;
$this->_productFactory = $productFactory;
$this->_fbeHelper = $helper;
$this->_formKeyValidator = $formKeyValidator;
$this->_magentoDataHelper = $magentoDataHelper;
}
private function getCategory($product)
{
$category_ids = $product->getCategoryIds();
if (count($category_ids) > 0) {
$category_names = [];
$category_model = $this->_fbeHelper->getObject(\Magento\Catalog\Model\Category::class);
foreach ($category_ids as $category_id) {
$category = $category_model->load($category_id);
$category_names[] = $category->getName();
}
return addslashes(implode(',', $category_names));
} else {
return null;
}
}
private function getValue($product)
{
if ($product && $product->getId()) {
$price = $product->getFinalPrice();
$price_helper = $this->_fbeHelper->getObject(\Magento\Framework\Pricing\Helper\Data::class);
return $price_helper->currency($price, false, false);
} else {
return null;
}
}
private function getProductInfo($product_sku)
{
$response_data = [];
$product = $this->_magentoDataHelper->getProductWithSku($product_sku);
if ($product->getId()) {
$response_data['id'] = $product->getId();
$response_data['name'] = $product->getName();
$response_data['category'] = $this->getCategory($product);
$response_data['value'] = $this->getValue($product);
}
return $response_data;
}
public function execute()
{
$product_sku = $this->getRequest()->getParam('product_sku', null);
if ($this->_formKeyValidator->validate($this->getRequest()) && $product_sku) {
$response_data = $this->getProductInfo($product_sku);
// If the sku is valid
// The event id is added in the response
// And a CAPI event is created
if (count($response_data) > 0) {
$event_id = EventIdGenerator::guidv4();
$response_data['event_id'] = $event_id;
$this->trackServerEvent($event_id);
$result = $this->_resultJsonFactory->create();
$result->setData(array_filter($response_data));
return $result;
}
} else {
$this->_redirect('noroute');
}
}
public function trackServerEvent($eventId)
{
$this->_eventManager->dispatch(
'facebook_businessextension_ssapi_add_to_cart',
['eventId' => $eventId]
);
}
}