Untitled
unknown
php
2 years ago
10 kB
10
Indexable
<?php
class ModSNPopularProductsHelper
{
public const IMAGE_EXTENSION = '_promo.png';
public const IMAGE_DIR = '/images/stories/sn/';
public const OVERLAY_DIR = '/images/stories/sn/_overlays/';
public const GTM_POSITION = 'most-popular-products';
/**
* @param Registry $params
* @return array
*/
public static function getProductIds(Registry &$params): array
{
$productsId = [];
if (!empty($params->get('use_recomendation')) && $params->get('use_recomendation') === '1' && Factory::getUser()->guest === 0) {
$productsId = RecommendationHelper::getByUser();
} elseif (!empty($params->get('use_recomendation')) && $params->get('use_recomendation') === '1' && Factory::getUser()->guest === 1) {
$productsId = RecommendationHelper::getByNewUser($params->get('new_user_period', 168));
} else {
foreach ($params as $key => $value) {
if (strpos($key, 'product') !== false && strpos($key, 'gtm') === false) {
$productsId[$key] = $value;
}
}
}
return array_filter($productsId);
}
/**
* @param Registry $params
* @param array $productIds
* @return array
* @throws Exception
*/
public static function fetchProducts(Registry $params, array $productIds): array
{
$items = [];
$mainParams = ComponentHelper::getParams('com_snv2');
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select(
[
$db->qn('p.id'),
$db->qn('p.alias'),
$db->qn('p.price'),
$db->qn('p.price_crossed'),
$db->qn('p.published'),
$db->qn('p.instock'),
$db->qn('p.short_usp'),
$db->qn('p.usp'),
$db->qn('p.name'),
$db->qn('p.show_price'),
$db->qn('p.overlay')
]
)
->from($db->qn('#__sn_products', 'p'))
->where($db->qn('p.published') . ' = 1')
->where($db->qn('p.instock') . ' = 1');
if (!empty($params->get('use_recomendation')) && $params->get('use_recomendation') === '1') {
$query->where($db->qn('p.vista_only') . ' = 0')->where($db->qn('p.lp_published') . ' = 0');
}
$query->where('p.id IN (' . implode(',', $productIds) . ')');
$db->setQuery($query);
try {
$products = $db->loadAssocList();
$prodArr = [];
foreach ($products as $key => $product) {
$prodArr[$product['id']] = $product;
}
$finalProdArr = [];
foreach ($productIds as $key => $product) {
if (!empty($prodArr[$product])) {
$finalProdArr[$product] = $prodArr[$product];
// add gtm tags
$finalProdArr[$product]['gtm_ac'] = $params->get($key . '_gtm_ac');
$finalProdArr[$product]['gtm_campaign'] = $params->get($key . '_gtm_campaign');
$finalProdArr[$product]['gtm_creative'] = $params->get($key . '_gtm_creative');
$finalProdArr[$product]['gtm_position'] = self::GTM_POSITION;
}
}
$finalProdArr = array_filter($finalProdArr);
foreach ($finalProdArr as $key => $product) {
if ((int) $product['published']) {
$finalProdArr[$key]['showPrice'] = ($product['instock'] || (!$product['instock'] && $mainParams->get('show_sold_out_price', '0', 'STRING') === '1'));
$finalProdArr[$key]['link'] = Route::_('index.php?option=com_snv2&view=product&id=' . $product['id']);
$finalProdArr[$key]['cartlink'] = rtrim(Uri::root(), '/') . '/index.php?option=com_snv2&task=basket.addToCart&pId=' . $product['id'];
$finalProdArr[$key]['price_crossed'] = (is_null($product['price_crossed']) || $product['price_crossed'] === "0.00") ? null : $product['price_crossed'];
$finalProdArr[$key]['price'] = SNPrice::_($product['price']);
$finalProdArr[$key]['price_crossed'] = SNPrice::_($product['price_crossed']);
$finalProdArr[$key]['overlay'] = (is_null($product['overlay']) || $product['overlay'] === "-1") ? null : rtrim(Uri::root(), '/') . self::OVERLAY_DIR . $product['overlay'];
}
}
foreach ($productIds as $key => $product) {
if (!empty($finalProdArr[$product])) {
$productNumber = (int) str_replace('product', '', $key);
$finalProdArr[$product] = (object) $finalProdArr[$product];
$finalProdArr[$product] = self::addGtmToSingleProduct($finalProdArr[$product], $productNumber, $params);
if ($productNumber <= 8) {
$items['new'][] = $finalProdArr[$product];
} elseif ($params->get('use_recomendation') !== '1') {
$items['returning'][] = $finalProdArr[$product];
}
}
}
} catch (\RuntimeException $e) {
Factory::getApplication()->enqueueMessage('Unable to fetch products from the most popular products module', 'error');
}
return $items;
}
/**
* @param array $productIds
* @return array
*/
public static function fetchImages(array $productIds): array
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select(
[
$db->qn('i.product_id'),
$db->qn('i.name'),
$db->qn('i.alias'),
$db->qn('i.ordering'),
$db->qn('i.background'),
$db->qn('i.published')
]
)
->from($db->qn('#__sn_products_pictures', 'i'))
->where($db->qn('i.published') . ' = 1')
->where('i.product_id IN (' . implode(',', $productIds) . ')');
$query->order($db->qn('i.ordering') . ' ASC');
$db->setQuery($query);
try {
$images = $db->loadAssocList();
} catch (\RuntimeException $e) {
$images = [];
}
$results = [];
foreach ($images as $k => $img) {
$results[$img['product_id']][] = $img['alias'];
}
return $results;
}
/**
* @param array $products
* @param array $images
* @return array
*/
public static function sanitizeProducts(array $products, array $images): array
{
foreach ($products as $product) {
foreach ($product as $pr) {
if (!isset($images[$pr->id])) {
continue;
}
$pr->images = [];
foreach ($images[$pr->id] as $img) {
$pr->images[] = self::generateImgPath($pr->alias, $img);
}
$pr->path = JPATH_ROOT . self::IMAGE_DIR . $pr->alias . '/' . $images[$pr->id][0] . '.png';
}
}
return $products;
}
/**
* @param stdClass $product
* @param int $productNumber
* @param Registry $params
* @return stdClass
*/
public static function addGtmToSingleProduct(stdClass $product, int $productNumber, Registry $params): stdClass
{
if ($params->get('use_recomendation') === '1') {
$product->gtm_ac = !empty($product->gtm_ac) ? $product->gtm_ac : $params->get('gtm_ac');
$product->gtm_campaign = !empty($product->gtm_campaign) ? $product->gtm_campaign : $params->get('gtm_campaign');
$product->gtm_creative = !empty($product->gtm_creative) ? $product->gtm_creative : $params->get('gtm_creative');
$product->gtm_position = self::GTM_POSITION;
return $product;
}
$product->gtm_ac = !empty($product->gtm_ac) ? $product->gtm_ac : $params->get('product' . $productNumber . '_gtm_ac');
$product->gtm_campaign = !empty($product->gtm_campaign) ? $product->gtm_campaign : $params->get('product' . $productNumber . '_gtm_campaign');
$product->gtm_creative = !empty($product->gtm_creative) ? $product->gtm_creative : $params->get('product' . $productNumber . '_gtm_creative');
$product->gtm_position = self::GTM_POSITION;
return $product;
}
/**
* @param string $productAlias
* @param string $imageName
* @return string
*/
public static function generateImgPath(string $productAlias, string $imageName): string
{
return rtrim(Uri::root(), '/') . self::IMAGE_DIR . $productAlias . '/' . $imageName . self::IMAGE_EXTENSION;
}
/**
* @param Registry $params
* @return array
* @throws Exception
*/
public static function getProducts(Registry &$params): array
{
$productIds = self::getProductIds($params);
$products = self::fetchProducts($params, $productIds);
if (!empty($products['new']) && count($products['new']) > 8) {
$products['new'] = array_slice($products['new'], 0, 8);
}
$images = self::fetchImages($productIds);
return self::sanitizeProducts($products, $images);
}
/**
* Get View/Buy buttons
* @return array button states
*/
public static function getButtons($params)
{
if ($params->get('show_view_button') == null) {
$viewButton = 1;
} else {
$viewButton = $params->get('show_view_button');
}
$buyButton = $params->get('show_buy_button') ? 1 : 0;
return ['viewButton' => $viewButton, 'buyButton' => $buyButton];
}
}
Editor is loading...