Files
shopPRO/autoload/front/factory/class.ShopProduct.php

355 lines
12 KiB
PHP

<?php
namespace front\factory;
class ShopProduct
{
// get_sellasist_product_id
static public function get_sellasist_product_id( $product_id ) {
global $mdb;
if ( !$sellasist_product_id = $mdb -> get( 'pp_shop_products', 'sellasist_product_id', [ 'id' => $product_id ] ) ) {
$sellasist_product_id = $mdb -> get( 'pp_shop_products', 'sellasist_product_id', [ 'id' =>
$mdb -> get( 'pp_shop_products', 'parent_id', [ 'id' => $product_id ] )
] );
}
return $sellasist_product_id;
}
// get_product_sku
static public function get_product_sku( $product_id )
{
global $mdb;
return $mdb -> get( 'pp_shop_products', 'sku', [ 'id' => $product_id ] );
}
// get_product_ean
static public function get_product_ean( $product_id )
{
global $mdb;
return $mdb -> get( 'pp_shop_products', 'ean', [ 'id' => $product_id ] );
}
static public function is_product_active( int $product_id )
{
global $mdb;
$cacheHandler = new \CacheHandler();
$cacheKey = "\front\factory\ShopProduct::is_product_active:$product_id";
$objectData = $cacheHandler -> get( $cacheKey );
if ( !$objectData )
{
$is_active = $mdb -> get( 'pp_shop_products', 'status', [ 'id' => $product_id ] );
$cacheHandler -> set( $cacheKey, $is_active );
}
else
{
return unserialize( $objectData );
}
return $is_active;
}
static public function product_url( $product )
{
if ( $product['language']['seo_link'] )
{
$url = '/' . $product['language']['seo_link'];
}
else
{
if ( $product['parent_id'] )
$url = '/p-' . $product['parent_id'] . '-' . \S::seo( $product['language']['name'] );
else
$url = '/p-' . $product['id'] . '-' . \S::seo( $product['language']['name'] );
}
return $url;
}
static public function get_minimal_price( $id_product, $price_brutto_promo = null )
{
global $mdb;
if ( !$price = \Cache::fetch( 'get_minimal_price:' . $id_product ) )
{
$price = $mdb -> min( 'pp_shop_product_price_history', 'price', [ 'AND' => [ 'id_product' => $id_product, 'price[!]' => str_replace( ',', '.', $price_brutto_promo ) ] ] );
\Cache::store( 'get_minimal_price:' . $id_product, $price );
}
return $price;
}
public static function product_categories( $product_id )
{
global $mdb;
if ( $parent_id = $mdb -> get( 'pp_shop_products', 'parent_id', [ 'id' => $product_id ] ) )
return \R::getAll( 'SELECT category_id FROM pp_shop_products_categories WHERE product_id = ?', [ $parent_id ] );
else
return \R::getAll( 'SELECT category_id FROM pp_shop_products_categories WHERE product_id = ?', [ $product_id ] );
}
public static function product_name( $product_id )
{
global $mdb, $lang_id;
if ( !$product_name = \Cache::fetch( 'product_name' . $lang_id . '_' . $product_id ) )
{
$product_name = $mdb -> get( 'pp_shop_products_langs', 'name', [ 'AND' => [ 'product_id' => (int)$product_id, 'lang_id' => $lang_id ] ] );
\Cache::store( 'product_name' . $lang_id . '_' . $product_id, $product_name );
}
return $product_name;
}
public static function product_image( $product_id )
{
global $mdb;
if ( !$product_image = \Cache::fetch( 'product_image:' . $product_id ) )
{
$results = $mdb -> query( 'SELECT src FROM pp_shop_products_images WHERE product_id = :product_id ORDER BY o ASC LIMIT 1', [ ':product_id' => (int)$product_id ] ) -> fetchAll( \PDO::FETCH_ASSOC );
$product_image = $results[ 0 ][ 'src' ];
\Cache::store( 'product_image:' . $product_id, $product_image );
}
return $product_image;
}
public static function product_wp( $product_id )
{
global $mdb;
$cacheHandler = new \CacheHandler();
$cacheKey = "\front\factory\ShopProduct::product_wp:$product_id";
$objectData = $cacheHandler -> get( $cacheKey );
if ( !$objectData )
{
$product_wp = $mdb -> get( 'pp_shop_products', 'wp', [ 'id' => $product_id ] );
$cacheHandler -> set( $cacheKey, $product_wp );
}
else
{
return unserialize( $objectData );
}
return $product_wp;
}
public static function random_products( $product_id, $lang_id = 'pl' )
{
global $mdb;
if ( !$products = \Cache::fetch( 'random_productsa_' . $product_id . '_' . $lang_id ) )
{
$results = $mdb -> query( 'SELECT id FROM pp_shop_products WHERE status = 1 ORDER BY RAND() LIMIT 6' ) -> fetchAll();
if ( is_array( $results ) and!empty( $results ) )
foreach ( $results as $row )
$products[] = \front\factory\ShopProduct::product_details( $row[ 'id' ], $lang_id );
\Cache::store( 'random_products_' . $product_id . '_' . $lang_id, $products );
}
return $products;
}
public static function promoted_products( $limit = 6 )
{
global $mdb;
if ( !$products = \Cache::fetch( "promoted_products-$limit" ) )
{
$results = $mdb -> query( 'SELECT id FROM pp_shop_products WHERE status = 1 AND promoted = 1 ORDER BY RAND() LIMIT ' . $limit ) -> fetchAll();
if ( is_array( $results ) and!empty( $results ) )
foreach ( $results as $row )
$products[] = $row[ 'id' ];
\Cache::store( "promoted_products-$limit", $products );
}
return $products;
}
public static function top_products( $limit = 6 )
{
global $mdb;
$date_30_days_ago = date('Y-m-d', strtotime('-30 days'));
$products = $mdb -> query( "SELECT COUNT(0) AS sell_count, psop.parent_product_id FROM pp_shop_order_products AS psop INNER JOIN pp_shop_orders AS pso ON pso.id = psop.order_id WHERE pso.date_order >= '$date_30_days_ago' GROUP BY parent_product_id ORDER BY sell_count DESC")->fetchAll(\PDO::FETCH_ASSOC);
foreach ( $products as $product )
{
if ( \front\factory\ShopProduct::is_product_active( $product['parent_product_id'] ) )
$product_ids[] = $product['parent_product_id'];
}
return $product_ids;
}
public static function new_products( $limit = 10 ) {
global $mdb;
$results = $mdb->query("
SELECT id
FROM pp_shop_products
WHERE status = 1
ORDER BY date_add DESC
LIMIT $limit
")->fetchAll(\PDO::FETCH_ASSOC);
return array_column($results, 'id');
}
public static function product_details( $product_id, $lang_id )
{
global $mdb;
if ( !$product_id )
return false;
$cacheHandler = new \CacheHandler();
$cacheKey = "\front\factory\ShopProduct::product_details:$product_id:$lang_id";
$objectData = $cacheHandler->get($cacheKey);
if ( !$objectData )
{
$product = $mdb -> get( 'pp_shop_products', '*', [ 'id' => (int)$product_id ] );
$results = $mdb -> select( 'pp_shop_products_langs', '*', [ 'AND' => [ 'product_id' => (int)$product_id, 'lang_id' => $lang_id ] ] );
if ( is_array( $results ) )
foreach ( $results as $row )
{
if ( $row[ 'copy_from' ] )
{
$results2 = $mdb -> select( 'pp_shop_products_langs', '*', [ 'AND' => [ 'product_id' => (int)$product_id, 'lang_id' => $row[ 'copy_from' ] ] ] );
if ( is_array( $results2 ) )
foreach ( $results2 as $row2 )
$product[ 'language' ] = $row2;
}
else
$product[ 'language' ] = $row;
}
$results = $mdb -> query( 'SELECT '
. 'DISTINCT( attribute_id ) '
. 'FROM '
. 'pp_shop_products_attributes AS pspa '
. 'INNER JOIN pp_shop_attributes AS psa ON psa.id = pspa.attribute_id '
. 'WHERE '
. 'product_id = ' . (int)$product_id . ' '
. 'ORDER BY '
. 'o ASC' ) -> fetchAll();
if ( is_array( $results ) )
foreach ( $results as $row )
{
$row[ 'type' ] = $mdb -> get( 'pp_shop_attributes',
'type',
[ 'id' => $row[ 'attribute_id' ] ]
);
$row[ 'language' ] = $mdb -> get( 'pp_shop_attributes_langs',
[ 'name' ],
[ 'AND' =>
[ 'attribute_id' => $row[ 'attribute_id' ], 'lang_id' => $lang_id ]
]
);
$results2 = $mdb -> query( 'SELECT '
. 'value_id, is_default '
. 'FROM '
. 'pp_shop_products_attributes AS pspa '
. 'INNER JOIN pp_shop_attributes_values AS psav ON psav.id = pspa.value_id '
. 'WHERE '
. 'product_id = :product_id '
. 'AND '
. 'pspa.attribute_id = :attribute_id ',
[
':product_id' => $product_id,
':attribute_id' => $row[ 'attribute_id' ]
]
) -> fetchAll( \PDO::FETCH_ASSOC );
if ( is_array( $results2 ) )
foreach ( $results2 as $row2 )
{
$row2[ 'language' ] = $mdb -> get( 'pp_shop_attributes_values_langs',
[ 'name', 'value' ],
[ 'AND' =>
[ 'value_id' => $row2[ 'value_id' ], 'lang_id' => $lang_id ]
]
);
$row[ 'values' ][] = $row2;
}
$product[ 'attributes' ][] = $row;
}
$product[ 'images' ] = $mdb -> select( 'pp_shop_products_images', '*', [ 'product_id' => (int)$product_id, 'ORDER' => [ 'o' => 'ASC', 'id' => 'ASC' ] ] );
$product[ 'files' ] = $mdb -> select( 'pp_shop_products_files', '*', [ 'product_id' => (int)$product_id ] );
$product[ 'categories' ] = $mdb -> select( 'pp_shop_products_categories', 'category_id', [ 'product_id' => (int)$product_id ] );
$product[ 'products_related' ] = $mdb -> select( 'pp_shop_products_related', 'product_related_id', [ 'product_id' => (int)$product_id ] );
$set_id = $mdb -> select( 'pp_shop_product_sets_products', 'set_id', [ 'product_id' => (int)$product_id ] );
$products_sets = $mdb -> select( 'pp_shop_product_sets_products', 'product_id', [ 'set_id' => (int)$set_id ] );
$products_sets = array_unique( $products_sets );
$product[ 'products_sets' ] = $products_sets;
$attributes = $mdb -> select( 'pp_shop_products_attributes', [ 'attribute_id', 'value_id' ], [ 'product_id' => (int)$product_id ] );
if ( is_array( $attributes ) ): foreach ( $attributes as $attribute ):
$attributes_tmp[ $attribute[ 'attribute_id' ] ][] = $attribute[ 'value_id' ];
endforeach;
endif;
if ( is_array( $attributes_tmp ) )
$product[ 'permutations' ] = \S::array_cartesian_product( $attributes_tmp );
$cacheHandler -> set( $cacheKey, $product );
}
else
{
return unserialize($objectData);
}
return $product;
}
public static function warehouse_message_zero( $id_product, $lang_id )
{
global $mdb, $lang_id;
return $mdb -> get( 'pp_shop_products_langs', 'warehouse_message_zero', [ 'AND' => [ 'product_id' => $id_product, 'lang_id' => $lang_id ] ] );
}
public static function warehouse_message_nonzero( $id_product, $lang_id )
{
global $mdb, $lang_id;
return $mdb -> get( 'pp_shop_products_langs', 'warehouse_message_nonzero', [ 'AND' => [ 'product_id' => $id_product, 'lang_id' => $lang_id ] ] );
}
//TO:DO do usunięcia
public static function product_both_price( $product_id )
{
global $mdb;
return $mdb -> get( 'pp_shop_products', [ 'price_brutto', 'price_brutto_promo' ], [ 'id' => (int)$product_id ] );
}
//TO:DO do usunięcia
public static function product_price( $product_id )
{
global $mdb;
$product = $mdb -> get( 'pp_shop_products', [ 'price_brutto', 'price_brutto_promo', 'vat' ], [ 'id' => (int)$product_id ] );
if ( $product[ 'price_brutto_promo' ] )
return $product[ 'price_brutto_promo' ];
else
return $product[ 'price_brutto' ];
}
}