first commit

This commit is contained in:
2024-11-05 12:22:50 +01:00
commit e5682a3912
19641 changed files with 2948548 additions and 0 deletions

View File

@@ -0,0 +1,230 @@
<?php
/**
* 2007-2015 Leotheme
*
* NOTICE OF LICENSE
*
* Leo feature for prestashop 1.7: ajax cart, review, compare, wishlist at product list
*
* DISCLAIMER
*
* @author leotheme <leotheme@gmail.com>
* @copyright 2007-2015 Leotheme
* @license http://leotheme.com - prestashop template provider
*/
if (!defined('_PS_VERSION_')) {
# module validation
exit;
}
class LeoProductAttribute
{
public function getReqQuantity($product) {
$quantity = (int)$this->getMinimalQuantity($product);
if ($quantity < $product['minimal_quantity']) {
$quantity = $product['minimal_quantity'];
}
return $quantity;
}
public function getMinimalQuantity($product) {
$minimalQuantity = 1;
if ($product['id_product_attribute']) {
$combination = $this->getCombinationsByID($product['id_product_attribute'], $product['id']);
if ($combination['minimal_quantity']) {
$minimalQuantity = $combination['minimal_quantity'];
}
} else {
$minimalQuantity = $product['minimal_quantity'];
}
return $minimalQuantity;
}
public function getCombinationsByID($combinationId, $productId) {
$product = new Product((int)$productId);
$findedCombination = null;
$combinations = $product->getAttributesGroups(Context::getContext()->language->id);
foreach ($combinations as $combination) {
if ((int) ($combination['id_product_attribute']) === $combinationId) {
$findedCombination = $combination;
break;
}
}
return $findedCombination;
}
public static function getProductAttributesID($productId, $attributesId) {
if (!is_array($attributesId)) {
return 0;
}
$productAttributeId = Db::getInstance()->getValue('
SELECT pac.`id_product_attribute`
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
INNER JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.id_product_attribute = pac.id_product_attribute
WHERE id_product = '.(int)$productId.' AND id_attribute IN ('.implode(',', array_map('intval', $attributesId)).')
GROUP BY id_product_attribute
HAVING COUNT(id_product) = '.count($attributesId));
if ($productAttributeId === false) {
$ordered = array();
$result = Db::getInstance()->executeS('SELECT `id_attribute` FROM `'._DB_PREFIX_.'attribute` a
INNER JOIN `'._DB_PREFIX_.'attribute_group` g ON a.`id_attribute_group` = g.`id_attribute_group`
WHERE `id_attribute` IN ('.implode(',', array_map('intval', $attributesId)).') ORDER BY g.`position` ASC');
foreach ($result as $row) {
$ordered[] = $row['id_attribute'];
}
while ($productAttributeId === false && count($ordered) > 0) {
array_pop($ordered);
$productAttributeId = Db::getInstance()->getValue('
SELECT pac.`id_product_attribute`
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
INNER JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.id_product_attribute = pac.id_product_attribute
WHERE id_product = '.(int)$productId.' AND id_attribute IN ('.implode(',', array_map('intval', $ordered)).')
GROUP BY id_product_attribute
HAVING COUNT(id_product) = '.count($ordered));
}
}
return $productAttributeId;
}
public static function getAttributesParams($productId, $productAttributeId) {
$langId = (int)Context::getContext()->language->id;
return Db::getInstance()->executeS('
SELECT a.`id_attribute`, a.`id_attribute_group`
FROM `'._DB_PREFIX_.'attribute` a
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al
ON (al.`id_attribute` = a.`id_attribute` AND al.`id_lang` = '.(int)$langId.')
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac
ON (pac.`id_attribute` = a.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl
ON (a.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.(int)$langId.')
WHERE pa.`id_product` = '.(int)$productId.'
AND pac.`id_product_attribute` = '.(int)$productAttributeId.'
AND agl.`id_lang` = '.(int)$langId);
}
public static function getProductCombinationsSeparatelly($idProduct, $idProductAttribute) {
$product = new Product((int)$idProduct, true, (int)Context::getContext()->language->id, (int)Context::getContext()->shop->id);
$attributes = self::getAttributesParams((int)$idProduct, (int)$idProductAttribute);
$productAttributes = array();
foreach ($attributes as $attribute) {
$productAttributes['attributes'][$attribute['id_attribute_group']] = $attribute;
}
$groups = array();
$attributesGroups = $product->getAttributesGroups(Context::getContext()->language->id);
if (is_array($attributesGroups) && $attributesGroups) {
foreach ($attributesGroups as $k => $row) {
if (!isset($groups[$row['id_attribute_group']])) {
$groups[$row['id_attribute_group']] = array(
'group_name' => $row['group_name'],
'name' => $row['public_group_name'],
'group_type' => $row['group_type'],
'default' => -1,
);
}
$groups[$row['id_attribute_group']]['attributes'][$row['id_attribute']] = array(
'name' => $row['attribute_name'],
'html_color_code' => $row['attribute_color'],
'texture' => (@filemtime(_PS_COL_IMG_DIR_.$row['id_attribute'].'.jpg')) ? _THEME_COL_DIR_.$row['id_attribute'].'.jpg' : '',
'selected' => (isset($productAttributes['attributes'][$row['id_attribute_group']]['id_attribute']) && $productAttributes['attributes'][$row['id_attribute_group']]['id_attribute'] == $row['id_attribute']) ? true : false,
);
if ($row['default_on'] && $groups[$row['id_attribute_group']]['default'] == -1) {
$groups[$row['id_attribute_group']]['default'] = (int) $row['id_attribute'];
}
if (!isset($groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']])) {
$groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0;
}
$groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int) $row['quantity'];
}
$currentSelectedAttributes = array();
$count = 0;
foreach ($groups as &$group) {
$count++;
if ($count > 1) {
$attributesId = Db::getInstance()->executeS('SELECT `id_attribute` FROM `'._DB_PREFIX_.'product_attribute_combination` pac2
INNER JOIN (
SELECT pac.`id_product_attribute`
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
INNER JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.id_product_attribute = pac.id_product_attribute
WHERE id_product = '.(int)$product->id.' AND id_attribute IN ('.implode(',', array_map('intval', $currentSelectedAttributes)).')
GROUP BY id_product_attribute
HAVING COUNT(id_product) = '.count($currentSelectedAttributes).'
)pac on pac.`id_product_attribute` = pac2.`id_product_attribute`
AND id_attribute NOT IN ('.implode(',', array_map('intval', $currentSelectedAttributes)).')');
foreach ($attributesId as $k => $row) {
$attributesId[$k] = (int)$row['id_attribute'];
}
foreach ($group['attributes'] as $key => $attribute) {
if (!in_array((int)$key, $attributesId)) {
unset($group['attributes'][$key]);
unset($group['attributes_quantity'][$key]);
}
}
}
$index = 0;
$currentSelectedAttribute = 0;
foreach ($group['attributes'] as $key => $attribute) {
if ($index === 0) {
$currentSelectedAttribute = $key;
}
if ($attribute['selected']) {
$currentSelectedAttribute = $key;
break;
}
}
if ($currentSelectedAttribute > 0) {
$currentSelectedAttributes[] = $currentSelectedAttribute;
}
}
if (!Product::isAvailableWhenOutOfStock($product->out_of_stock) && Configuration::get('PS_DISP_UNAVAILABLE_ATTR') == 0) {
foreach ($groups as &$group) {
foreach ($group['attributes_quantity'] as $key => &$quantity) {
if ($quantity <= 0) {
unset($group['attributes'][$key]);
}
}
}
}
}
return $groups;
}
public static function getProductCombinationsList($productID, $showOutOfStock, $idProductAttribute = 0) {
$product = new Product($productID);
$combinations = $product->getAttributeCombinations((int)Context::getContext()->language->id);
$productsVariants = array();
if (is_array($combinations)) {
foreach ($combinations as $k => $combination) {
if ((!$showOutOfStock && (int)$combination['quantity'] > 0) || $showOutOfStock) {
$productsVariants[$combination['id_product_attribute']]['id_product_attribute'] = $combination['id_product_attribute'];
$productsVariants[$combination['id_product_attribute']]['attributes'][] = array($combination['group_name'], $combination['attribute_name'], $combination['id_attribute'], $combination['id_attribute_group']);
$productsVariants[$combination['id_product_attribute']]['price'] = $product->getPrice(true, $combination['id_product_attribute'], (int)Configuration::get('PS_PRICE_DISPLAY_PRECISION'));
if ($idProductAttribute > 0) {
$productsVariants[$combination['id_product_attribute']]['default_on'] = ($idProductAttribute == $combination['id_product_attribute']);
} else {
$productsVariants[$combination['id_product_attribute']]['default_on'] = $combination['default_on'];
}
}
}
}
if (isset($productsVariants)) {
foreach ($productsVariants as $id_product_attribute => $product_attribute) {
$list = '';
asort($product_attribute['attributes']);
foreach ($product_attribute['attributes'] as $attribute) {
$list .= $attribute[0].' - '.$attribute[1].', ';
}
$list = rtrim($list, ', ');
$productsVariants[$id_product_attribute]['name'] = $list;
}
}
return $productsVariants;
}
}