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

1547 lines
64 KiB
PHP

<?php
namespace admin\factory;
use shop\Product;
class ShopProduct
{
// count_product
static public function count_product( $where = null )
{
global $mdb;
if ( $where )
return $mdb -> count( 'pp_shop_products', $where );
else
return $mdb -> count( 'pp_shop_products', [ 'archive' => 0 ] );
}
static public function update_product_combinations_prices( int $product_id, $price_brutto, $vat, $price_brutto_promo )
{
global $mdb;
$products = $mdb -> query( 'SELECT psp.id, parent_id '
. 'FROM pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_attributes AS pspa ON psp.id = pspa.product_id '
. 'INNER JOIN pp_shop_attributes_values AS psav ON pspa.value_id = psav.id '
. 'WHERE psav.impact_on_the_price > 0 AND psp.parent_id = :product_id', [ ':product_id' => $product_id ] ) -> fetchAll( \PDO::FETCH_ASSOC );
foreach ( $products as $product )
{
$price_brutto_combination = $price_brutto;
$price_brutto_promo_combination = $price_brutto_promo;
$values = $mdb -> query( 'SELECT impact_on_the_price FROM pp_shop_attributes_values AS psav INNER JOIN pp_shop_products_attributes AS pspa ON pspa.value_id = psav.id WHERE impact_on_the_price IS NOT NULL AND product_id = :product_id', [ ':product_id' => $product['id'] ] ) -> fetchAll( \PDO::FETCH_ASSOC );
foreach ( $values as $value )
{
$price_brutto_combination += $value['impact_on_the_price'];
if ( $price_brutto_promo )
$price_brutto_promo_combination += $value['impact_on_the_price'];
else
$price_brutto_promo_combination = null;
}
$price_netto_combination = \S::normalize_decimal( $price_brutto_combination / ( 100 + $vat ) * 100, 2 );
if ( $price_brutto_promo_combination )
$price_netto_promo_combination = \S::normalize_decimal( $price_brutto_promo_combination / ( 100 + $vat ) * 100, 2 );
else
$price_netto_promo_combination = null;
$mdb -> update( 'pp_shop_products', [ 'price_netto' => $price_netto_combination, 'price_brutto' => $price_brutto_combination, 'price_netto_promo' => $price_netto_promo_combination, 'price_brutto_promo' => $price_brutto_promo_combination ], [ 'id' => $product['id'] ] );
}
}
// szybka zmiana statusu produktu
static public function change_product_status( int $product_id ) {
global $mdb;
$status = $mdb -> get( 'pp_shop_products', 'status', [ 'id' => $product_id ] );
$status = $status == 1 ? 0 : 1;
return $mdb -> update( 'pp_shop_products', [ 'status' => $status ], [ 'id' => $product_id ] );
}
// domyślna nazwa produktu
static public function product_default_name( int $product_id ) {
global $mdb;
$default_lang = $mdb -> get( 'pp_langs', 'id', [ 'start' => 1 ] );
return $mdb -> get( 'pp_shop_products_langs', 'name', [ 'AND' => [ 'product_id' => $product_id, 'lang_id' => $default_lang ] ] );
}
// lista produktów do wiązania z baselinkerem
static public function products_list_for_baselinker()
{
global $mdb;
$results = $mdb -> select( 'pp_shop_products', [ 'id', 'sku', 'baselinker_product_id' ], [ 'parent_id' => null, 'ORDER' => [ 'baselinker_product_id' => 'ASC', 'sku' => 'ASC' ] ] );
foreach ( $results as $row ) {
$row['name'] = self::product_default_name( $row['id'] );
$products[] = $row;
}
return $products;
}
// szybka zmiana google xml label
static public function product_change_custom_label( int $product_id, $custom_label, $value )
{
global $mdb;
return $mdb -> update( 'pp_shop_products', [ 'custom_label_' . $custom_label => $value ? $value : null ], [ 'id' => $product_id ] );
}
// szybka zmiana ceny promocyjnej
static public function product_change_price_brutto_promo( int $product_id, $price )
{
global $mdb;
$vat = $mdb -> get( 'pp_shop_products', 'vat', [ 'id' => $product_id ] );
$price_netto = \S::normalize_decimal( (float)$price / ( 100 + (float)$vat ) * 100, 2 );
return $mdb -> update( 'pp_shop_products', [ 'price_brutto_promo' => $price != 0.00 ? $price : null, 'price_netto_promo' => $price_netto != 0.00 ? $price : null ], [ 'id' => $product_id ] );
}
// szybka zmiana ceny
static public function product_change_price_brutto( int $product_id, $price )
{
global $mdb;
$vat = $mdb -> get( 'pp_shop_products', 'vat', [ 'id' => $product_id ] );
$price_netto = \S::normalize_decimal( (float)$price / ( 100 + (float)$vat ) * 100, 2 );
return $mdb -> update( 'pp_shop_products', [ 'price_brutto' => $price != 0.00 ? $price : null, 'price_netto' => $price_netto != 0.00 ? $price : null ], [ 'id' => $product_id ] );
}
// pobierz id produktu głównego
static public function get_product_parent_id( int $product_id )
{
global $mdb;
return $mdb -> get( 'pp_shop_products', 'parent_id', [ 'id' => $product_id ] );
}
// usunięcie kombinacji produktu
static public function delete_combination( int $combination_id )
{
global $mdb;
$mdb -> delete( 'pp_shop_products', [ 'id' => $combination_id ] );
$mdb -> delete( 'pp_shop_products_attributes', [ 'product_id' => $combination_id ] );
return true;
}
// pobranie permutacji produktu
static public function get_product_permutations( int $product_id )
{
global $mdb;
$results = $mdb -> select( 'pp_shop_products', 'id', [ 'parent_id' => $product_id ] );
if ( \S::is_array_fix( $results ) ) foreach ( $results as $row )
$products[] = \admin\factory\ShopProduct::product_details( $row );
return $products;
}
// generowanie kombinacji produktu
static public function generate_permutation( int $product_id, $attributes )
{
global $mdb;
$vat = $mdb -> get( 'pp_shop_products', 'vat', [ 'id' => $product_id ] );
$permutations = \shop\Product::array_cartesian( $attributes );
if ( \S::is_array_fix( $permutations ) ) foreach ( $permutations as $permutation )
{
$product = null;
ksort( $permutation );
$permutation_hash = '';
if ( \S::is_array_fix( $permutation ) ) foreach ( $permutation as $key => $val )
{
if ( $permutation_hash )
$permutation_hash .= '|';
$permutation_hash .= $key . '-' . $val;
// sprawdzenie czy atrybut ma wpływ na cenę
$value_details = \admin\factory\ShopAttribute::value_details( $val );
$impact_on_the_price = $value_details[ 'impact_on_the_price' ];
if ( $impact_on_the_price > 0 )
{
if ( !$product )
$product = \admin\factory\ShopProduct::product_details( $product_id );
$product_price_brutto = $product['price_brutto'] + $impact_on_the_price;
$product_price_netto = $product_price_brutto / ( 1 + ( $product['vat'] / 100 ) );
if ( $product['price_brutto_promo'] )
{
$product_price_brutto_promo = $product['price_brutto_promo'] + $impact_on_the_price;
$product_price_netto_promo = $product_price_brutto_promo / ( 1 + ( $product['vat'] / 100 ) );
}
else
{
$product_price_brutto_promo = null;
$product_price_netto_promo = null;
}
}
if ( $permutation_hash and !$mdb -> count( 'pp_shop_products', [ 'AND' => [ 'parent_id' => $product_id, 'permutation_hash' => $permutation_hash ] ] ) )
{
if ( $mdb -> insert( 'pp_shop_products', [ 'parent_id' => $product_id, 'permutation_hash' => $permutation_hash, 'vat' => $vat ] ) )
{
$combination_id = $mdb -> id();
if ( $product )
{
$mdb -> update( 'pp_shop_products', [ 'price_netto' => $product_price_netto, 'vat' => $product['vat'], 'price_brutto' => $product_price_brutto, 'price_netto_promo' => $product_price_netto_promo, 'price_brutto_promo' => $product_price_brutto_promo ], [ 'id' => $combination_id ] );
}
$permutation_hash_rev_rows = explode( '|', $permutation_hash );
foreach ( $permutation_hash_rev_rows as $permutation_hash_rev )
{
$attribute_rev = explode( '-', $permutation_hash_rev );
$mdb -> insert( 'pp_shop_products_attributes', [ 'product_id' => $combination_id, 'attribute_id' => $attribute_rev[0], 'value_id' => $attribute_rev[1] ] );
}
}
}
}
}
return true;
}
public static function product_name($product_id)
{
global $mdb;
$results = $mdb -> query("SELECT pspl.name FROM pp_shop_products_langs AS pspl, pp_langs AS pl WHERE lang_id = pl.id AND product_id = :product_id AND pspl.name != '' ORDER BY o ASC LIMIT 1", [':product_id' => $product_id]) -> fetchAll();
return $results[0]['name'];
}
public static function get_product_images($product_id)
{
global $mdb;
return $mdb -> select('pp_shop_products_images', 'src', ['product_id' => (int) $product_id, 'ORDER' => ['o' => 'ASC', 'id' => 'ASC']]);
}
static public function generate_EAN( $number )
{
$code = '200' . str_pad($number, 9, '0');
$weightflag = true;
$sum = 0;
for ($i = strlen($code) - 1; $i >= 0; $i--)
{
$sum += (int)$code[$i] * ($weightflag?3:1);
$weightflag = !$weightflag;
}
$code .= (10 - ($sum % 10)) % 10;
return $code;
}
static public function generate_google_feed_xml()
{
global $mdb, $lang_id;
$settings = \front\factory\Settings::settings_details(true);
$domain_prefix = 'https';
$url = preg_replace('#^(http(s)?://)?w{3}\.#', '$1', $_SERVER['SERVER_NAME']);
$main_language = \front\factory\Languages::default_language();
$doc = new \DOMDocument('1.0', 'UTF-8');
$xmlRoot = $doc -> createElement('rss');
$xmlRoot = $doc -> appendChild($xmlRoot);
$xmlRoot -> setAttribute('version', '2.0');
$xmlRoot -> setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:g', 'http://base.google.com/ns/1.0');
$channelNode = $xmlRoot -> appendChild($doc -> createElement('channel'));
$channelNode -> appendChild( $doc -> createElement( 'title', $settings['firm_name']));
$channelNode -> appendChild( $doc -> createElement( 'link', $domain_prefix . '://' . $url ) );
$rows = $mdb -> select( 'pp_shop_products', 'id', [ 'AND' => [ 'status' => '1', 'archive' => 0, 'parent_id' => null ] ] );
if ( \S::is_array_fix( $rows ) ) foreach ( $rows as $product_id )
{
$product = \shop\Product::getFromCache( $product_id, $lang_id );
if ( is_array( $product -> product_combinations ) and count( $product -> product_combinations ) )
{
foreach ( $product -> product_combinations as $product_combination )
{
if ( $product_combination -> quantity !== null or $product_combination -> stock_0_buy )
{
$itemNode = $channelNode -> appendChild( $doc -> createElement( 'item' ) );
$p_gid = $itemNode -> appendChild( $doc -> createElement('g:id', $product_combination -> id ) );
$p_groupid = $itemNode -> appendChild( $doc -> createElement( 'g:item_group_id', $product -> id ) );
if ( $product -> custom_label_0 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_0', $product -> custom_label_0 ) );
if ( $product -> custom_label_1 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_1', $product -> custom_label_1 ) );
if ( $product -> custom_label_2 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_2', $product -> custom_label_2 ) );
if ( $product -> custom_label_3 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_3', $product -> custom_label_3 ) );
if ( $product -> custom_label_4 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_4', $product -> custom_label_4 ) );
if ( $product -> language['xml_name'] )
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['xml_name'] ) . ' - ' . $product -> generateSubtitleFromAttributes( $product_combination -> permutation_hash ) ) );
else
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['name'] ) . ' - ' . $product -> generateSubtitleFromAttributes( $product_combination -> permutation_hash ) ) );
if ( $product -> ean )
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', $product -> ean ) );
else
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', self::generate_EAN( $product -> id ) ) );
// opis produktu
if ( $product -> language['short_description'] )
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['short_description'] ) ) ) );
else
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['name'] ) ) ) );
if ( $product -> language['seo_link'] )
$link = $domain_prefix . '://' . $url . '/' . \S::seo( $product -> language['seo_link'] ) . '/' . str_replace( '|', '/', $product_combination -> permutation_hash );
else
$link = $domain_prefix . '://' . $url . '/' . 'p-' . $product -> id . '-' . \S::seo( $product -> language['name'] ) . '/' . str_replace( '|', '/', $product_combination -> permutation_hash );
$p_link = $itemNode -> appendChild( $doc -> createElement( 'link', $link ) );
if ( $product -> images[0] )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:image_link', $domain_prefix . '://' . $url . $product -> images[0]['src'] ) );
if ( count( $product -> images ) > 1 )
{
for ( $i = 1; $i < count( $product -> images ); ++$i )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:additional_image_link', $domain_prefix . '://' . $url . $product -> images[$i]['src'] ) );
}
$p_gcondition = $itemNode -> appendChild( $doc -> createElement( 'g:condition', 'new' ) );
if ( $product_combination -> quantity !== null )
{
if ( $product_combination -> quantity > 0 )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product_combination -> quantity ) );
}
else
{
if ( $product_combination -> stock_0_buy )
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
else
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
}
}
else
{
if ( $product -> quantity > 0 )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product -> quantity ) );
}
else
{
if ( $product -> stock_0_buy )
{
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 999 ) );
}
else
{
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 0 ) );
}
}
}
if ( $product_combination -> price_brutto )
{
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product_combination -> price_brutto . ' PLN' ) );
if ( $product_combination -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product_combination -> price_brutto_promo . ' PLN' ) );
}
else
{
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product -> price_brutto . ' PLN' ) );
if ( $product -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product -> price_brutto_promo . ' PLN' ) );
}
$p_gshipping = $itemNode -> appendChild( $doc -> createElement( 'g:shipping' ) );
$p_gcountry = $p_gshipping -> appendChild( $doc -> createElement( 'g:country', 'PL' ) );
$p_gservice = $p_gshipping -> appendChild( $doc -> createElement( 'g:service', '1 dzień roboczy' ) );
$p_gprice = $p_gshipping -> appendChild( $doc -> createElement( 'g:price', \admin\factory\ShopTransport::lowest_transport_price( (int) $product -> wp ) . ' PLN' ) );
}
}
}
else
{
$itemNode = $channelNode -> appendChild( $doc -> createElement( 'item' ) );
$p_gid = $itemNode -> appendChild( $doc -> createElement('g:id', $product -> id ) );
$p_groupid = $itemNode -> appendChild( $doc -> createElement( 'g:item_group_id', $product -> id ) );
if ( $product -> google_xml_label )
$p_label = $itemNode -> appendChild($doc -> createElement('g:custom_label_0', $product -> google_xml_label ) );
if ( $product -> language['xml_name'] )
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['xml_name'] ) ) );
else
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['name'] ) ) );
if ( $product -> ean )
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', $product -> ean ) );
else
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', self::generate_EAN( $product -> id ) ) );
// opis produktu
if ( $product -> language['short_description'] )
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['short_description'] ) ) ) );
else
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['name'] ) ) ) );
if ( $product -> language['seo_link'] )
$link = $domain_prefix . '://' . $url . '/' . \S::seo( $product -> language['seo_link'] );
else
$link = $domain_prefix . '://' . $url . '/' . 'p-' . $product -> id . '-' . \S::seo( $product -> language['name'] );
$p_link = $itemNode -> appendChild( $doc -> createElement( 'link', $link ) );
if ( $product -> custom_label_0 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_0', $product -> custom_label_0 ) );
if ( $product -> custom_label_1 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_1', $product -> custom_label_1 ) );
if ( $product -> custom_label_2 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_2', $product -> custom_label_2 ) );
if ( $product -> custom_label_3 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_3', $product -> custom_label_3 ) );
if ( $product -> custom_label_4 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_4', $product -> custom_label_4 ) );
if ( $product -> images[0] )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:image_link', $domain_prefix . '://' . $url . $product -> images[0]['src'] ) );
if ( count( $product -> images ) > 1 )
{
for ( $i = 1; $i < count( $product -> images ); ++$i )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:additional_image_link', $domain_prefix . '://' . $url . $product -> images[$i]['src'] ) );
}
$p_gcondition = $itemNode -> appendChild( $doc -> createElement( 'g:condition', 'new' ) );
if ( $product -> quantity )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product -> quantity ) );
}
else
{
if ( $product -> stock_0_buy ) {
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 999 ) );
}
else {
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 0 ) );
}
}
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product -> price_brutto . ' PLN' ) );
if ( $product -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product -> price_brutto_promo . ' PLN' ) );
$p_gshipping = $itemNode -> appendChild( $doc -> createElement( 'g:shipping' ) );
$p_gcountry = $p_gshipping -> appendChild( $doc -> createElement( 'g:country', 'PL' ) );
$p_gservice = $p_gshipping -> appendChild( $doc -> createElement( 'g:service', '1 dzień roboczy' ) );
$p_gprice = $p_gshipping -> appendChild( $doc -> createElement( 'g:price', \admin\factory\ShopTransport::lowest_transport_price( (int) $product -> wp ) . ' PLN' ) );
}
}
file_put_contents('../google-feed.xml', $doc -> saveXML());
}
static public function count_product_combinations( int $product_id )
{
global $mdb;
return $mdb -> count( 'pp_shop_products', [ 'parent_id' => $product_id ] );
}
// ajax_products_list
static public function ajax_products_list_archive( $current_page = null, $query = null )
{
global $mdb;
$search = '';
if ( $query )
{
$query_array = [];
parse_str( $query, $query_array );
foreach ( $query_array as $key => $val ) {
if ( $val !== '' )
$search .= ' AND ' . $key . ' LIKE \'%' . $val . '%\'';
}
}
$results = $mdb -> query( 'SELECT '
. 'DISTINCT( psp.id )'
. 'FROM '
. 'pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_langs AS pspl ON pspl.product_id = psp.id '
. 'WHERE archive = 1 AND parent_id IS NULL ' . $search . ' ORDER BY id DESC LIMIT ' . ( $current_page - 1 ) * 10 . ', 10' ) -> fetchAll( \PDO::FETCH_ASSOC );
$results2 = $mdb -> query( 'SELECT '
. 'COUNT( DISTINCT( psp.id ) ) AS products_count '
. 'FROM '
. 'pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_langs AS pspl ON pspl.product_id = psp.id '
. 'WHERE archive = 1 AND parent_id IS NULL ' . $search ) -> fetchAll( \PDO::FETCH_ASSOC );
if ( is_array( $results ) ) foreach ( $results as $row ) {
$products[] = \admin\factory\ShopProduct::product_details( $row['id'] );
}
return [ 'products' => $products, 'products_count' => $results2[0]['products_count'] ];
}
// ajax_products_list
static public function ajax_products_list( $current_page = null, $query = null )
{
global $mdb;
if ( $query )
{
$search = '';
$query_array = [];
parse_str( $query, $query_array );
foreach ( $query_array as $key => $val ) {
if ( strpos( $key, '|' ) !== false )
{
$keys_tmp = explode( '|', $key );
$search .= ' AND ( ';
foreach ( $keys_tmp as $key_tmp )
{
if ( $key_tmp != reset( $keys_tmp ) )
$search .= ' OR ' . $key_tmp . ' LIKE \'%' . $val . '%\'';
else
$search .= ' ' . $key_tmp . ' LIKE \'%' . $val . '%\'';
}
$search .= ' )';
}
else
{
$search .= ' AND ' . $key . ' LIKE \'%' . $val . '%\'';
}
}
$results = $mdb -> query( 'SELECT '
. 'DISTINCT( psp.id )'
. 'FROM '
. 'pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_langs AS pspl ON pspl.product_id = psp.id '
. 'WHERE archive = 0 AND parent_id IS NULL ' . $search . ' ORDER BY id DESC LIMIT ' . ( $current_page - 1 ) * 10 . ', 10' ) -> fetchAll( \PDO::FETCH_ASSOC );
$results2 = $mdb -> query( 'SELECT '
. 'COUNT( DISTINCT( psp.id ) ) AS products_count '
. 'FROM '
. 'pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_langs AS pspl ON pspl.product_id = psp.id '
. 'WHERE archive = 0 AND parent_id IS NULL ' . $search ) -> fetchAll( \PDO::FETCH_ASSOC );
} else {
$results = $mdb -> query( 'SELECT id FROM pp_shop_products WHERE parent_id IS NULL ORDER BY id DESC LIMIT ' . ( $current_page - 1 ) * 10 . ', 10' ) -> fetchAll( \PDO::FETCH_ASSOC );
$results2 = $mdb -> query( 'SELECT COUNT( id ) AS products_count FROM pp_shop_products WHERE parent_id IS NULL' ) -> fetchAll( \PDO::FETCH_ASSOC );
}
if ( is_array( $results ) ) foreach ( $results as $row ) {
$products[] = \admin\factory\ShopProduct::product_details( $row['id'] );
}
return [ 'products' => $products, 'products_count' => $results2[0]['products_count'] ];
}
public static function products_list()
{
global $mdb;
$results = $mdb -> select( 'pp_shop_products', 'id', [ 'parent_id' => null ] );
if ( is_array( $results ) ) foreach ( $results as $row )
{
$products[ $row ] = $mdb -> get ('pp_shop_products_langs', 'name', ['AND' => [ 'product_id' => $row, 'lang_id' => 'pl' ] ] );
}
return $products;
}
public static function images_order_save($product_id, $order)
{
global $mdb;
$order = explode(';', $order);
if (\is_array($order) && !empty($order))
{
foreach ($order as $image_id)
{
$mdb -> update('pp_shop_products_images', [
'o' => $i++,
], [
'AND' => [
'product_id' => $product_id,
'id' => $image_id,
],
]);
}
}
return true;
}
public static function image_alt_change($image_id, $image_alt)
{
global $mdb;
$result = $mdb -> update('pp_shop_products_images', [
'alt' => $image_alt,
], [
'id' => $image_id,
]);
\S::delete_cache();
return $result;
}
// product_unarchive
static public function product_unarchive( int $product_id )
{
global $mdb;
$mdb -> update( 'pp_shop_products', [ 'status' => 1, 'archive' => 0 ], [ 'id' => $product_id ] );
$mdb -> update( 'pp_shop_products', [ 'status' => 1, 'archive' => 0 ], [ 'parent_id' => $product_id ] );
return true;
}
static public function product_archive( int $product_id )
{
global $mdb;
$mdb -> update( 'pp_shop_products', [ 'status' => 0, 'archive' => 1 ], [ 'id' => $product_id ] );
$mdb -> update( 'pp_shop_products', [ 'status' => 0, 'archive' => 1 ], [ 'parent_id' => $product_id ] );
return true;
}
public static function product_delete( int $product_id)
{
global $mdb;
$mdb -> delete( 'pp_shop_products_categories', ['product_id' => $product_id ] );
$mdb -> delete( 'pp_shop_products_langs', ['product_id' => $product_id ] );
$mdb -> delete( 'pp_shop_products_images', ['product_id' => $product_id ] );
$mdb -> delete( 'pp_shop_products_files', ['product_id' => $product_id ] );
$mdb -> delete( 'pp_shop_products_attributes', ['product_id' => $product_id ] );
$mdb -> delete( 'pp_shop_products', ['id' => $product_id ] );
$mdb -> delete( 'pp_shop_product_sets_products', [ 'product_id' => $product_id ] );
// pp_routes
$mdb -> delete( 'pp_routes', [ 'product_id' => $product_id ] );
// pp_redirects
$mdb -> delete( 'pp_redirects', [ 'product_id' => $product_id ] );
\S::delete_dir( '../upload/product_images/product_' . $product_id . '/' );
\S::delete_dir( '../upload/product_files/product_' . $product_id . '/' );
return true;
}
public static function product_categories($product_id)
{
global $mdb;
$results = $mdb -> query('SELECT category_id FROM pp_shop_products_categories WHERE product_id = '.(int) $product_id) -> fetchAll();
if (\is_array($results) && !empty($results))
{
foreach ($results as $row)
{
if ('' === $out)
{
$out .= ' - ';
}
$out .= \admin\factory\ShopCategory::category_title($row['category_id']);
if (end($results) !== $row)
{
$out .= ' / ';
}
}
}
return $out;
}
public static function max_order()
{
global $mdb;
return $mdb -> max('pp_shop_products_categories', 'o');
}
public static function delete_img($image_id)
{
global $mdb;
$mdb -> update('pp_shop_products_images', ['to_delete' => 1], ['id' => (int) $image_id]);
return true;
}
public static function delete_nonassigned_images()
{
global $mdb;
$results = $mdb -> select('pp_shop_products_images', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
if (file_exists('../'.$row['src']))
{
unlink('../'.$row['src']);
}
}
}
$mdb -> delete('pp_shop_products_images', ['product_id' => null]);
}
public static function file_name_change($file_id, $file_name)
{
global $mdb;
$mdb -> update('pp_shop_products_files', ['name' => $file_name], ['id' => (int) $file_id]);
return true;
}
public static function delete_file($file_id)
{
global $mdb;
$mdb -> update('pp_shop_products_files', ['to_delete' => 1], ['id' => (int) $file_id]);
return true;
}
public static function delete_nonassigned_files()
{
global $mdb;
$results = $mdb -> select('pp_shop_products_files', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
if (file_exists('../'.$row['src']))
{
unlink('../'.$row['src']);
}
}
}
$mdb -> delete('pp_shop_products_files', ['product_id' => null]);
}
public static function save(
$product_id, $name, $short_description, $description, $status, $meta_description, $meta_keywords, $seo_link, $copy_from, $categories, $price_netto, $price_brutto, $vat, $promoted, $warehouse_message_zero, $warehouse_message_nonzero, $tab_name_1, $tab_description_1, $tab_name_2, $tab_description_2, $layout_id, $products_related, int $set_id, $price_netto_promo, $price_brutto_promo, $new_to_date, $stock_0_buy, $wp, $custom_label_0, $custom_label_1, $custom_label_2, $custom_label_3, $custom_label_4, $additional_message, int $quantity, $additional_message_text, int $additional_message_required, $canonical, $meta_title, $producer_id, $sku, $ean, $product_unit, $weight, $xml_name, $custom_field_name, $custom_field_required, $security_information, $custom_field_type
)
{
global $mdb, $user;
if ( !$product_id )
{
$mdb -> insert('pp_shop_products', [
'date_add' => date('Y-m-d H:i:s'),
'date_modify' => date('Y-m-d H:i:s'),
'modify_by' => $user['id'],
'status' => 'on' === $status ? 1 : 0,
'price_netto' => ($price_netto && 0.00 !== $price_netto) ? $price_netto : null,
'price_brutto' => ($price_brutto && 0.00 !== $price_brutto) ? $price_brutto : null,
'vat' => $vat,
'promoted' => 'on' === $promoted ? 1 : 0,
'layout_id' => $layout_id ? $layout_id : null,
'price_netto_promo' => ($price_netto_promo && 0.00 !== $price_netto_promo) ? $price_netto_promo : null,
'price_brutto_promo' => ($price_brutto_promo && 0.00 !== $price_brutto_promo) ? $price_brutto_promo : null,
'new_to_date' => $new_to_date ? $new_to_date : null,
'stock_0_buy' => 'on' === $stock_0_buy ? 1 : 0,
'wp' => $wp ? $wp : null,
'sku' => $sku ? $sku : null,
'ean' => $ean ? $ean : null,
'custom_label_0' => $custom_label_0 ? $custom_label_0 : null,
'custom_label_1' => $custom_label_1 ? $custom_label_1 : null,
'custom_label_2' => $custom_label_2 ? $custom_label_2 : null,
'custom_label_3' => $custom_label_3 ? $custom_label_3 : null,
'custom_label_4' => $custom_label_4 ? $custom_label_4 : null,
'additional_message' => $additional_message == 'on' ? 1 : 0,
'set_id' => $set_id ? $set_id : null,
'quantity' => $quantity,
'additional_message_text' => $additional_message_text ? $additional_message_text : null,
'additional_message_required' => $additional_message_required,
'producer_id' => !empty( $producer_id ) ? $producer_id : null,
'product_unit_id' => !empty( $product_unit ) ? $product_unit : null,
'weight' => !empty( $weight ) ? $weight : null,
] );
$id = $mdb -> id();
if ( $id )
{
$langs = \admin\factory\Languages::languages_list( true );
foreach ( $langs as $lg )
{
$mdb -> insert( 'pp_shop_products_langs', [
'product_id' => (int) $id,
'lang_id' => $lg['id'],
'name' => $name[$lg['id']] ? $name[$lg['id']] : null,
'short_description' => $short_description[$lg['id']] ? $short_description[$lg['id']] : null,
'description' => $description[$lg['id']] ? $description[$lg['id']] : null,
'meta_description' => $meta_description[$lg['id']] ? $meta_description[$lg['id']] : null,
'meta_keywords' => $meta_keywords[$lg['id']] ? $meta_keywords[$lg['id']] : null,
'seo_link' => $seo_link[$lg['id']] ? \S::seo($seo_link[$lg['id']]) : null,
'copy_from' => $copy_from[$lg['id']] ? $copy_from[$lg['id']] : null,
'warehouse_message_zero' => $warehouse_message_zero[$lg['id']] ? $warehouse_message_zero[$lg['id']] : null,
'warehouse_message_nonzero' => $warehouse_message_nonzero[$lg['id']] ? $warehouse_message_nonzero[$lg['id']] : null,
'tab_name_1' => $tab_name_1[$lg['id']] ? $tab_name_1[$lg['id']] : null,
'tab_description_1' => $tab_description_1[$lg['id']] ? $tab_description_1[$lg['id']] : null,
'tab_name_2' => $tab_name_2[$lg['id']] ? $tab_name_2[$lg['id']] : null,
'tab_description_2' => $tab_description_2[$lg['id']] ? $tab_description_2[$lg['id']] : null,
'canonical' => $canonical[$lg['id']] ? $canonical[$lg['id']] : null,
'meta_title' => $meta_title[$lg['id']] ? $meta_title[$lg['id']] : null,
'xml_name' => $xml_name[$lg['id']] ? $xml_name[$lg['id']] : null,
'security_information' => $security_information[$lg['id']] ? $security_information[$lg['id']] : null,
] );
}
if ( is_array($categories))
{
foreach ($categories as $category)
{
$order = self::max_order() + 1;
$mdb -> insert('pp_shop_products_categories', [
'product_id' => (int) $id,
'category_id' => (int) $category,
'o' => (int) $order,
]);
}
}
elseif ($categories)
{
$order = self::max_order() + 1;
$mdb -> insert('pp_shop_products_categories', [
'product_id' => (int) $id,
'category_id' => (int) $categories,
'o' => (int) $order,
]);
}
if (\is_array($products_related))
{
foreach ($products_related as $product_related )
{
$mdb -> insert('pp_shop_products_related', [
'product_id' => (int) $id,
'product_related_id' => (int) $product_related,
]);
}
}
elseif ( $products_related )
{
$mdb -> insert('pp_shop_products_related', [
'product_id' => (int) $id,
'product_related_id' => (int) $products_related,
]);
}
$created = false;
$results = $mdb -> select('pp_shop_products_files', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
$dir = '/upload/product_files/product_'.$id;
$new_file_name = str_replace('/upload/product_files/tmp', $dir, $row['src']);
if (file_exists('..'.$row['src']))
{
if (!is_dir('../'.$dir) && true !== $created)
{
if (mkdir('../'.$dir, 0755, true))
{
$created = true;
}
}
rename('..'.$row['src'], '..'.$new_file_name);
}
$mdb -> update('pp_shop_products_files', ['src' => $new_file_name, 'product_id' => $id], ['id' => $row['id']]);
}
}
$created = false;
$results = $mdb -> select('pp_shop_products_images', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
$dir = '/upload/product_images/product_'.$id;
$new_file_name = str_replace('/upload/product_images/tmp', $dir, $row['src']);
if (file_exists('../'.$new_file_name))
{
$ext = strrpos($new_file_name, '.');
$fileName_a = substr($new_file_name, 0, $ext);
$fileName_b = substr($new_file_name, $ext);
$count = 1;
while (file_exists('../'.$fileName_a.'_'.$count.$fileName_b))
{
++$count;
}
$new_file_name = $fileName_a.'_'.$count.$fileName_b;
}
if (file_exists('..'.$row['src']))
{
if (!is_dir('../'.$dir) && true !== $created)
{
if (mkdir('../'.$dir, 0755, true))
{
$created = true;
}
}
rename('..'.$row['src'], '..'.$new_file_name);
}
$mdb -> update('pp_shop_products_images', ['src' => $new_file_name, 'product_id' => (int) $id], ['id' => $row['id']]);
}
}
// dodatkowe pola
for ( $i = 0; $i < count( $custom_field_name ); ++$i )
{
if ( !empty( $custom_field_name[$i] ) )
{
$custom_field = $custom_field_name[$i];
$custom_field_type_data = $custom_field_type[$i];
$custom_field_required = isset( $custom_field_required[$i] ) ? 1 : 0;
$mdb -> insert( 'pp_shop_products_custom_fields', [
'id_product' => (int) $id,
'name' => $custom_field,
'type' => $custom_field_type_data,
'is_required' => $custom_field_required,
] );
}
}
\S::htacces();
\S::delete_dir('../temp/');
\S::delete_dir('../thumbs/');
return $id;
}
}
else
{
$mdb -> update( 'pp_shop_products', [
'date_modify' => date('Y-m-d H:i:s'),
'modify_by' => $user['id'],
'status' => 'on' === $status ? 1 : 0,
'price_netto' => ($price_netto && 0.00 !== $price_netto) ? $price_netto : null,
'price_brutto' => ($price_brutto && 0.00 !== $price_brutto) ? $price_brutto : null,
'vat' => $vat,
'promoted' => 'on' === $promoted ? 1 : 0,
'layout_id' => $layout_id ? $layout_id : null,
'price_netto_promo' => ($price_netto_promo && 0.00 !== $price_netto_promo) ? $price_netto_promo : null,
'price_brutto_promo' => ($price_brutto_promo && 0.00 !== $price_brutto_promo) ? $price_brutto_promo : null,
'new_to_date' => $new_to_date ? $new_to_date : null,
'stock_0_buy' => 'on' === $stock_0_buy ? 1 : 0,
'wp' => $wp ? $wp : null,
'sku' => $sku ? $sku : null,
'ean' => $ean ? $ean : null,
'custom_label_0' => $custom_label_0 ? $custom_label_0 : null,
'custom_label_1' => $custom_label_1 ? $custom_label_1 : null,
'custom_label_2' => $custom_label_2 ? $custom_label_2 : null,
'custom_label_3' => $custom_label_3 ? $custom_label_3 : null,
'custom_label_4' => $custom_label_4 ? $custom_label_4 : null,
'additional_message' => $additional_message == 'on' ? 1 : 0,
'set_id' => $set_id ? $set_id : null,
'quantity' => $quantity,
'additional_message_text' => $additional_message_text ? $additional_message_text : null,
'additional_message_required' => $additional_message_required,
'producer_id' => !empty( $producer_id ) ? $producer_id : null,
'product_unit_id' => !empty( $product_unit ) ? $product_unit : null,
'weight' => !empty( $weight ) ? $weight : null,
], [
'id' => (int) $product_id,
] );
$mdb -> update( 'pp_shop_products', [
'additional_message' => $additional_message == 'on' ? 1 : 0,
], [
'parent_id' => (int) $product_id,
] );
\admin\factory\ShopProduct::update_product_combinations_prices( $product_id, $price_brutto, $vat, $price_brutto_promo );
$langs = \admin\factory\Languages::languages_list( true );
foreach ( $langs as $lg )
{
if ( $translation_id = $mdb -> get( 'pp_shop_products_langs', 'id', [ 'AND' => [ 'product_id' => $product_id, 'lang_id' => $lg['id'] ] ] ) )
{
$current_seo_link = $mdb -> get( 'pp_shop_products_langs', 'seo_link', [ 'id' => $translation_id ] );
if ( $seo_link[$lg['id']] )
$new_seo_link = \S::seo( $seo_link[$lg['id']] );
else
$new_seo_link = \S::seo( 'p-' . $product_id . '-' . $name[$lg['id']] );
if ( $new_seo_link !== $current_seo_link and $current_seo_link != '' )
{
if ( !$mdb -> count( 'pp_redirects', [ 'from' => $current_seo_link, 'to' => $new_seo_link, 'lang_id' => $lg['id'], 'product_id' => $product_id ] ) )
{
if ( $mdb -> count( 'pp_redirects', [ 'from' => $new_seo_link, 'to' => $current_seo_link, 'lang_id' => $lg['id'], 'product_id' => $product_id ] ) )
$mdb -> delete( 'pp_redirects', [ 'from' => $new_seo_link, 'to' => $current_seo_link, 'lang_id' => $lg['id'], 'product_id' => $product_id ] );
else
{
if ( \S::canAddRedirect( $current_seo_link, $new_seo_link ) )
$mdb -> insert( 'pp_redirects', [ 'from' => $current_seo_link, 'to' => $new_seo_link, 'lang_id' => $lg['id'], 'product_id' => $product_id ] );
else
$mdb -> delete( 'pp_redirects', [ 'product_id' => $product_id, 'lang_id' => $lg['id'] ] );
}
}
}
$mdb -> update( 'pp_shop_products_langs', [
'name' => $name[$lg['id']] ? $name[$lg['id']] : null,
'short_description' => $short_description[$lg['id']] ? $short_description[$lg['id']] : null,
'description' => $description[$lg['id']] ? $description[$lg['id']] : null,
'meta_description' => $meta_description[$lg['id']] ? $meta_description[$lg['id']] : null,
'meta_keywords' => $meta_keywords[$lg['id']] ? $meta_keywords[$lg['id']] : null,
'seo_link' => $seo_link[$lg['id']] ? \S::seo($seo_link[$lg['id']]) : null,
'copy_from' => $copy_from[$lg['id']] ? $copy_from[$lg['id']] : null,
'warehouse_message_zero' => $warehouse_message_zero[$lg['id']] ? $warehouse_message_zero[$lg['id']] : null,
'warehouse_message_nonzero' => $warehouse_message_nonzero[$lg['id']] ? $warehouse_message_nonzero[$lg['id']] : null,
'tab_name_1' => $tab_name_1[$lg['id']] ? $tab_name_1[$lg['id']] : null,
'tab_description_1' => $tab_description_1[$lg['id']] ? $tab_description_1[$lg['id']] : null,
'tab_name_2' => $tab_name_2[$lg['id']] ? $tab_name_2[$lg['id']] : null,
'tab_description_2' => $tab_description_2[$lg['id']] ? $tab_description_2[$lg['id']] : null,
'canonical' => $canonical[$lg['id']] ? $canonical[$lg['id']] : null,
'meta_title' => $meta_title[$lg['id']] ? $meta_title[$lg['id']] : null,
'xml_name' => $xml_name[$lg['id']] ? $xml_name[$lg['id']] : null,
'security_information' => $security_information[$lg['id']] ? $security_information[$lg['id']] : null,
], [
'id' => $translation_id
] );
}
else
{
$mdb -> insert( 'pp_shop_products_langs', [
'product_id' => (int) $product_id,
'lang_id' => $lg['id'],
'name' => $name[$lg['id']] ? $name[$lg['id']] : null,
'short_description' => $short_description[$lg['id']] ? $short_description[$lg['id']] : null,
'description' => $description[$lg['id']] ? $description[$lg['id']] : null,
'meta_description' => $meta_description[$lg['id']] ? $meta_description[$lg['id']] : null,
'meta_keywords' => $meta_keywords[$lg['id']] ? $meta_keywords[$lg['id']] : null,
'seo_link' => $seo_link[$lg['id']] ? \S::seo($seo_link[$lg['id']]) : null,
'copy_from' => $copy_from[$lg['id']] ? $copy_from[$lg['id']] : null,
'warehouse_message_zero' => $warehouse_message_zero[$lg['id']] ? $warehouse_message_zero[$lg['id']] : null,
'warehouse_message_nonzero' => $warehouse_message_nonzero[$lg['id']] ? $warehouse_message_nonzero[$lg['id']] : null,
'tab_name_1' => $tab_name_1[$lg['id']] ? $tab_name_1[$lg['id']] : null,
'tab_description_1' => $tab_description_1[$lg['id']] ? $tab_description_1[$lg['id']] : null,
'tab_name_2' => $tab_name_2[$lg['id']] ? $tab_name_2[$lg['id']] : null,
'tab_description_2' => $tab_description_2[$lg['id']] ? $tab_description_2[$lg['id']] : null,
'canonical' => $canonical[$lg['id']] ? $canonical[$lg['id']] : null,
'meta_title' => $meta_title[$lg['id']] ? $meta_title[$lg['id']] : null,
'xml_name' => $xml_name[$lg['id']] ? $xml_name[$lg['id']] : null,
'security_information' => $security_information[$lg['id']] ? $security_information[$lg['id']] : null,
] );
}
}
$not_in = [0];
if (\is_array($categories))
{
foreach ($categories as $category)
{
$not_in[] = $category;
}
}
elseif ($categories)
{
$not_in[] = $categories;
}
$mdb -> delete('pp_shop_products_categories', ['AND' => ['product_id' => (int) $product_id, 'category_id[!]' => $not_in]]);
$categories_tmp = $mdb -> select('pp_shop_products_categories', 'category_id', ['product_id' => (int) $product_id]);
if (!\is_array($categories))
{
$categories = [$categories];
}
$categories = array_diff($categories, $categories_tmp);
if (\is_array($categories))
{
foreach ($categories as $category)
{
$order = self::max_order() + 1;
if ( $product_id and $category )
$mdb -> insert( 'pp_shop_products_categories', [
'product_id' => (int)$product_id,
'category_id' => (int)$category,
'o' => (int) $order,
] );
}
}
// produkty powiązane
$not_in = [0];
if (\is_array($products_related))
{
foreach ($products_related as $product_related)
{
$not_in[] = $product_related;
}
}
elseif ($products_related)
{
$not_in[] = $products_related;
}
$mdb -> delete('pp_shop_products_related', ['AND' => ['product_id' => (int) $product_id, 'product_related_id[!]' => $not_in]]);
$products_related_tmp = $mdb -> select('pp_shop_products_related', 'product_related_id', ['product_id' => (int) $product_id]);
if (!\is_array($products_related))
{
$products_related = [$products_related];
}
$products_related = array_diff($products_related, $products_related_tmp);
if (\is_array($products_related))
{
foreach ($products_related as $product_related)
{
if ($product_id && $product_related)
{
$mdb -> insert('pp_shop_products_related', [
'product_id' => (int) $product_id,
'product_related_id' => (int) $product_related,
]);
}
}
}
$created = false;
$results = $mdb -> select('pp_shop_products_files', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
$dir = '/upload/product_files/product_'.$product_id;
$new_file_name = str_replace('/upload/product_files/tmp', $dir, $row['src']);
if (file_exists('..'.$row['src']))
{
if (!is_dir('../'.$dir) && true !== $created)
{
if (mkdir('../'.$dir, 0755, true))
{
$created = true;
}
}
rename('..'.$row['src'], '..'.$new_file_name);
}
$mdb -> update('pp_shop_products_files', ['src' => $new_file_name, 'product_id' => (int) $product_id], ['id' => $row['id']]);
}
}
$results = $mdb -> select('pp_shop_products_files', '*', ['AND' => ['product_id' => (int) $product_id, 'to_delete' => 1]]);
if (\is_array($results))
{
foreach ($results as $row)
{
if (file_exists('../'.$row['src']))
{
unlink('../'.$row['src']);
}
}
}
$mdb -> delete('pp_shop_products_files', ['AND' => ['product_id' => (int) $product_id, 'to_delete' => 1]]);
$created = false;
// zdjęcia
$results = $mdb -> select('pp_shop_products_images', '*', ['product_id' => null]);
if (\is_array($results))
{
foreach ($results as $row)
{
$dir = '/upload/product_images/product_'.$product_id;
$new_file_name = str_replace('/upload/product_images/tmp', $dir, $row['src']);
if (file_exists('../'.$new_file_name))
{
$ext = strrpos($new_file_name, '.');
$fileName_a = substr($new_file_name, 0, $ext);
$fileName_b = substr($new_file_name, $ext);
$count = 1;
while (file_exists('../'.$fileName_a.'_'.$count.$fileName_b))
{
++$count;
}
$new_file_name = $fileName_a.'_'.$count.$fileName_b;
}
if (file_exists('..'.$row['src']))
{
if (!is_dir('../'.$dir) && true !== $created)
{
if (mkdir('../'.$dir, 0755, true))
{
$created = true;
}
}
rename('..'.$row['src'], '..'.$new_file_name);
}
$mdb -> update('pp_shop_products_images', ['src' => $new_file_name, 'product_id' => (int) $product_id], ['id' => $row['id']]);
}
}
$results = $mdb -> select('pp_shop_products_images', '*', ['AND' => ['product_id' => (int) $product_id, 'to_delete' => 1]]);
if (\is_array($results))
{
foreach ($results as $row)
{
if (file_exists('../'.$row['src']))
{
unlink('../'.$row['src']);
}
}
}
$mdb -> delete('pp_shop_products_images', ['AND' => ['product_id' => (int) $product_id, 'to_delete' => 1]]);
// dodatkowe pola
// delete only custom fields that are not in the new list
foreach ( $custom_field_name as $custom_field )
{
if ( !empty( $custom_field ) )
{
$exits_custom_ids[] = (int)$mdb -> get( 'pp_shop_products_custom_fields', 'id_additional_field', [ 'AND' => [ 'id_product' => $product_id, 'name' => $custom_field ] ] );
}
}
$mdb -> delete( 'pp_shop_products_custom_fields', [ 'AND' => [ 'id_product' => $product_id, 'id_additional_field[!]' => $exits_custom_ids ] ] );
// $custom_field_name i $custom_field_required
foreach ( $custom_field_name as $i => $custom_field )
{
if ( !empty( $custom_field ) )
{
$custom_field_type_data = $custom_field_type[$i];
$is_required = !empty( $custom_field_required[$i] ) ? 1 : 0;
if ( !$mdb -> count( 'pp_shop_products_custom_fields', [ 'AND' => [ 'id_product' => $product_id, 'name' => $custom_field ] ] ) )
{
$mdb -> insert( 'pp_shop_products_custom_fields', [
'id_product' => $product_id,
'name' => $custom_field,
'type' => $custom_field_type_data,
'is_required' => $is_required
]);
}
else
{
$mdb -> update( 'pp_shop_products_custom_fields',
[
'type' => $custom_field_type_data,
'is_required' => $is_required
],
[ 'AND' => [ 'id_product' => $product_id, 'name' => $custom_field ] ]);
}
}
}
\S::htacces();
\S::delete_dir( '../temp/' );
\S::delete_dir( '../thumbs/' );
$redis = \RedisConnection::getInstance() -> getConnection();
if ( $redis )
$redis -> flushAll();
return $product_id;
}
}
// pobierz prostą listę z ilościami produktu
static public function get_product_quantity_list( int $product_id )
{
global $mdb;
return $mdb -> get( 'pp_shop_products', 'quantity', [ 'id' => $product_id ] );
}
// ADMIN - szczególy produktu
static public function product_details( int $product_id )
{
global $mdb;
if ( $product = $mdb -> get( 'pp_shop_products', '*', [ 'id' => $product_id ] ) )
{
$results = $mdb -> select( 'pp_shop_products_langs', '*', [ 'product_id' => $product_id ] );
if ( is_array( $results ) ) foreach ($results as $row)
$product['languages'][ $row['lang_id'] ] = $row;
$product['images'] = $mdb -> select( 'pp_shop_products_images', '*', [ 'product_id' => $product_id, 'ORDER' => [ 'o' => 'ASC', 'id' => 'ASC' ] ] );
$product['files'] = $mdb -> select( 'pp_shop_products_files', '*', [ 'product_id' => $product_id ] );
$product['categories'] = $mdb -> select( 'pp_shop_products_categories', 'category_id', [ 'product_id' => $product_id ] );
$product['attributes'] = $mdb -> select( 'pp_shop_products_attributes', [ 'attribute_id', 'value_id' ], [ 'product_id' => $product_id ] );
$product['products_related'] = $mdb -> select( 'pp_shop_products_related', 'product_related_id', [ 'product_id' => $product_id ] );
$product['custom_fields'] = $mdb -> select( 'pp_shop_products_custom_fields', '*', [ 'id_product' => $product_id ] );
}
return $product;
}
// duplikowanie produktu w panelu administratora
static public function duplicate_product( int $product_id, int $with_combinations = 0 )
{
global $mdb;
$product = $mdb -> get( 'pp_shop_products', '*', [ 'id' => $product_id ] );
if ( $product )
{
$mdb -> insert( 'pp_shop_products', [
'price_netto' => $product['price_netto'],
'price_brutto' => $product['price_brutto'],
'price_netto_promo' => $product['price_netto_promo'],
'price_brutto_promo' => $product['price_brutto_promo'],
'vat' => $product['vat'],
'promoted' => $product['promoted'],
'layout_id' => $product['layout_id'],
'new_to_date' => $product['new_to_date'],
'stock_0_buy' => $product['stock_0_buy'],
'wp' => $product['wp'],
'custom_label_0' => $product['custom_label_0'],
'custom_label_1' => $product['custom_label_1'],
'custom_label_2' => $product['custom_label_2'],
'custom_label_3' => $product['custom_label_3'],
'custom_label_4' => $product['custom_label_4'],
'additional_message' => $product['additional_message']
] );
$new_product_id = $mdb -> id();
if ( $new_product_id )
{
$attributes = $mdb -> select( 'pp_shop_products_attributes', '*', [ 'product_id' => $product_id ] );
if ( \S::is_array_fix( $attributes ) ) foreach ( $attributes as $row )
{
$mdb -> insert( 'pp_shop_products_attributes', [
'product_id' => $new_product_id,
'attribute_id' => $row['attribute_id'],
'value_id' => $row['value_id']
] );
}
$categories = $mdb -> select( 'pp_shop_products_categories', '*', [ 'product_id' => $product_id ] );
if ( \S::is_array_fix( $categories ) ) foreach ( $categories as $row )
{
$mdb -> insert( 'pp_shop_products_categories', [
'product_id' => $new_product_id,
'category_id' => $row['category_id'],
'o' => $row['o']
] );
}
$langs = $mdb -> select( 'pp_shop_products_langs', '*', [ 'product_id' => $product_id ] );
if ( \S::is_array_fix( $langs ) ) foreach ( $langs as $row )
{
$mdb -> insert( 'pp_shop_products_langs', [
'product_id' => $new_product_id,
'lang_id' => $row['lang_id'],
'name' => $row['name'] . ' - kopia',
'short_description' => $row['short_description'],
'description' => $row['description'],
'tab_name_1' => $row['tab_name_1'],
'tab_description_1' => $row['tab_description_1'],
'tab_name_2' => $row['tab_name_2'],
'tab_description_2' => $row['tab_description_2'],
'meta_description' => $row['meta_description'],
'meta_keywords' => $row['meta_keywords'],
'copy_from' => $row['copy_from'],
'warehouse_message_zero' => $row['warehouse_message_zero'],
'warehouse_message_nonzero' => $row['warehouse_message_nonzero']
] );
}
// custom fields
$custom_fields = $mdb -> select( 'pp_shop_products_custom_fields', '*', [ 'id_product' => $product_id ] );
if ( \S::is_array_fix( $custom_fields ) ) foreach ( $custom_fields as $row )
{
$mdb -> insert( 'pp_shop_products_custom_fields', [
'id_product' => $new_product_id,
'name' => $row['name']
] );
}
}
// duplikowanie kombinacji produktu
if ( $with_combinations )
{
$product_combinations = $mdb -> select( 'pp_shop_products', '*', [ 'parent_id' => $product_id ] );
foreach ( $product_combinations as $product_combination )
{
$mdb -> insert( 'pp_shop_products', [
'parent_id' => $new_product_id,
'permutation_hash' => $product_combination['permutation_hash'],
'price_netto' => $product_combination['price_netto'],
'price_brutto' => $product_combination['price_brutto'],
'price_netto_promo' => $product_combination['price_netto_promo'],
'price_brutto_promo' => $product_combination['price_brutto_promo'],
'vat' => $product_combination['vat'],
'stock_0_buy' => $product_combination['stock_0_buy'],
'quantity' => $product_combination['quantity'],
'wp' => $product_combination['wp'],
'additional_message' => $product_combination['additional_message'],
'additional_message_text' => $product_combination['additional_message_text'],
'additional_message_required' => $product_combination['additional_message_required']
] );
$combination_id = $mdb -> id();
if ( $combination_id )
{
$pp_shop_products_attributes = $mdb -> select( 'pp_shop_products_attributes', '*', [ 'product_id' => $product_combination['id'] ] );
foreach ( $pp_shop_products_attributes as $pp_shop_products_attribute )
{
$mdb -> insert( 'pp_shop_products_attributes', [
'product_id' => $combination_id,
'attribute_id' => $pp_shop_products_attribute['attribute_id'],
'value_id' => $pp_shop_products_attribute['value_id']
] );
}
}
}
}
return true;
}
return false;
}
//
// KOMBINACJE PRODUKTU
//
static public function product_combination_stock_0_buy_save( int $product_id, $stock_0_buy )
{
global $mdb;
return $mdb -> update( 'pp_shop_products', [ 'stock_0_buy' => $stock_0_buy == 'true' ? 1 : 0 ], [ 'id' => $product_id ] );
}
static public function product_combination_sku_save( int $product_id, $sku )
{
global $mdb;
return $mdb -> update( 'pp_shop_products', [ 'sku' => $sku ], [ 'id' => $product_id ] );
}
static public function product_combination_quantity_save( int $product_id, $quantity )
{
global $mdb;
return $mdb -> update( 'pp_shop_products', [ 'quantity' => $quantity == '' ? $quantity = null : $quantity = (int) $quantity ], [ 'id' => $product_id ] );
}
static public function product_combination_price_save( int $product_id, $price_netto )
{
global $mdb;
$vat = $mdb -> get( 'pp_shop_products', 'vat', [ 'id' => $product_id ] );
$price_brutto = $price_netto * ( 1 + ( $vat / 100 ) );
return $mdb -> update( 'pp_shop_products', [ 'price_netto' => $price_netto == '' ? $price_netto = null : $price_netto = (float) $price_netto, 'price_brutto' => $price_brutto == '' ? $price_brutto = null : $price_brutto = (float) $price_brutto ], [ 'id' => $product_id ] );
}
// aktualizacja ceny produktu pod wpływem zmiany ceny wartości atrybutu
static public function update_product_price_by_attribute_value_impact( $value_id, $impact_on_the_price )
{
global $mdb;
$products = $mdb -> select( 'pp_shop_products_attributes', [ 'product_id' ], [ 'value_id' => $value_id ] );
if ( is_array( $products ) ) foreach ( $products as $row )
{
$parent_id = $mdb -> get( 'pp_shop_products', 'parent_id', [ 'id' => $row['product_id'] ] );
$product = $mdb -> get( 'pp_shop_products', '*', [ 'id' => $parent_id ] );
if ( $product )
{
$price_brutto = $product['price_brutto'] + \S::normalize_decimal( $impact_on_the_price );
$price_netto = \S::normalize_decimal( $price_brutto / ( 1 + ( $product['vat'] / 100 ) ) );
if ( $product['price_netto_promo'] )
{
$price_brutto_promo = $product['price_brutto_promo'] + \S::normalize_decimal( $impact_on_the_price );
$price_netto_promo = \S::normalize_decimal( $price_brutto_promo / ( 1 + ( $product['vat'] / 100 ) ) );
}
else
{
$price_netto_promo = null;
$price_brutto_promo = null;
}
if ( $impact_on_the_price > 0 )
{
$mdb -> update( 'pp_shop_products', [ 'price_netto' => $price_netto, 'price_brutto' => $price_brutto, 'price_netto_promo' => $price_netto_promo, 'price_brutto_promo' => $price_brutto_promo, 'date_modify' => date( 'Y-m-d H:i:s' ) ], [ 'id' => $row['product_id'] ] );
}
else if ( isset( $impact_on_the_price ) && $impact_on_the_price == 0 && $impact_on_the_price != '' )
{
$mdb -> update( 'pp_shop_products', [ 'price_netto' => null, 'price_brutto' => null, 'price_netto_promo' => null, 'price_brutto_promo' => null, 'quantity' => null, 'stock_0_buy' => null, 'date_modify' => date( 'Y-m-d H:i:s' ) ], [ 'id' => $row['product_id'] ] );
}
}
}
}
}