This commit refactors the code in the ShopProduct class to improve the process of deleting a product and updating the SEO links. It adds new database queries to delete entries from the pp_routes and pp_redirects tables when a product is deleted. It also updates the SEO links for translated product names, ensuring that the new SEO link is generated correctly and checking for any existing redirects before adding a new one. Additionally, the commit adds a new function, canAddRedirect, to check for cycles in the redirect map before adding a new redirect. Refactor deleting product and updating SEO links in class.S This commit refactors the clear_redis_cache function in the S class to improve the process of updating the routes and redirects in the .htaccess file. It adds new database queries to delete entries from the pp_routes table and updates the code to generate the RewriteRule directives for the routes. It also adds a new condition to the .htaccess file to skip rewriting requests for existing files and directories. Refactor retrieving subcategories in class.Category This commit refactors the getCategoryData function in the Category class to improve the process of retrieving subcategories. It removes the ORDER clause from the database query to retrieve subcategories, allowing the categories to be returned in their natural order. This change ensures that the subcategories are displayed correctly in the category navigation. Check redirects and routes in index.php This commit adds new code to the index.php file to check for redirects and routes before processing the request. It checks if the requested URL matches any entries in the pp_redirects table and redirects the user to the new URL if a match is found. It also checks if the requested URL matches any entries in the pp_routes table and parses the destination to extract GET parameters if a match is found. This change improves the handling of redirects and routes in the application.
1572 lines
64 KiB
PHP
1572 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 ( 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( '&', '&', $product -> language['xml_name'] ) . ' - ' . $product -> generateSubtitleFromAttributes( $product_combination -> permutation_hash ) ) );
|
|
else
|
|
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&', $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( '&', '&', $product -> language['xml_name'] ) ) );
|
|
else
|
|
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&', $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;
|
|
|
|
if ( $query )
|
|
{
|
|
$search = '';
|
|
$query_array = [];
|
|
|
|
parse_str( $query, $query_array );
|
|
|
|
foreach ( $query_array as $key => $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 );
|
|
} 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'] ];
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
public static function permutation_quantity($id_product, $permutation)
|
|
{
|
|
global $mdb;
|
|
|
|
return $mdb -> get('pp_shop_products_stock', 'quantity', ['AND' => ['id_product' => $id_product, 'permutation' => $permutation]]);
|
|
}
|
|
|
|
public static function stock_save($id_product, $permutations_quantity)
|
|
{
|
|
global $mdb;
|
|
|
|
$mdb -> delete( 'pp_shop_products_stock', [ 'id_product' => $id_product ] );
|
|
|
|
if ( is_array( $permutations_quantity ) ) foreach ($permutations_quantity as $key => $val)
|
|
{
|
|
$permutations[] = $mdb -> get('pp_shop_products_stock', 'id', ['AND' => ['id_product' => $id_product, 'permutation' => $key]]);
|
|
$mdb -> delete('pp_shop_products_stock', ['AND' => ['id_product' => $id_product, 'id[!]' => $permutations]]);
|
|
}
|
|
|
|
if (\is_array($permutations_quantity))
|
|
{
|
|
foreach ($permutations_quantity as $key => $val)
|
|
{
|
|
if ($id = $mdb -> get('pp_shop_products_stock', 'id', ['AND' => ['id_product' => $id_product, 'permutation' => $key]]))
|
|
{
|
|
$mdb -> update('pp_shop_products_stock', [
|
|
'quantity' => $val,
|
|
], [
|
|
'id' => $id,
|
|
]);
|
|
\S::delete_dir('../temp/');
|
|
}
|
|
else
|
|
{
|
|
$mdb -> insert('pp_shop_products_stock', [
|
|
'id_product' => $id_product,
|
|
'permutation' => $key,
|
|
'quantity' => $val,
|
|
]);
|
|
\S::delete_dir('../temp/');
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// 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
|
|
)
|
|
{
|
|
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 )
|
|
{
|
|
foreach ( $name as $key => $val )
|
|
{
|
|
$mdb -> insert( 'pp_shop_products_langs', [
|
|
'product_id' => (int) $id,
|
|
'lang_id' => $key,
|
|
'name' => '' !== $name[$key] ? $name[$key] : null,
|
|
'short_description' => '' !== $short_description[$key] ? $short_description[$key] : null,
|
|
'description' => '' !== $description[$key] ? $description[$key] : null,
|
|
'meta_description' => '' !== $meta_description[$key] ? $meta_description[$key] : null,
|
|
'meta_keywords' => '' !== $meta_keywords[$key] ? $meta_keywords[$key] : null,
|
|
'seo_link' => '' !== \S::seo($seo_link[$key]) ? \S::seo($seo_link[$key]) : null,
|
|
'copy_from' => '' !== $copy_from[$key] ? $copy_from[$key] : null,
|
|
'warehouse_message_zero' => '' !== $warehouse_message_zero[$key] ? $warehouse_message_zero[$key] : null,
|
|
'warehouse_message_nonzero' => '' !== $warehouse_message_nonzero[$key] ? $warehouse_message_nonzero[$key] : null,
|
|
'tab_name_1' => '' !== $tab_name_1[$key] ? $tab_name_1[$key] : null,
|
|
'tab_description_1' => '' !== $tab_description_1[$key] ? $tab_description_1[$key] : null,
|
|
'tab_name_2' => '' !== $tab_name_2[$key] ? $tab_name_2[$key] : null,
|
|
'tab_description_2' => '' !== $tab_description_2[$key] ? $tab_description_2[$key] : null,
|
|
'canonical' => '' !== $canonical[$key] ? $canonical[$key] : null,
|
|
'meta_title' => '' !== $meta_title[$key] ? $meta_title[$key] : null,
|
|
'xml_name' => '' !== $xml_name[$key] ? $xml_name[$key] : 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
|
|
foreach ( $custom_field_name as $custom_field )
|
|
{
|
|
if ( !empty( $custom_field ) )
|
|
{
|
|
$mdb -> insert( 'pp_shop_products_custom_fields', [
|
|
'id_product' => (int) $id,
|
|
'name' => $custom_field,
|
|
] );
|
|
}
|
|
}
|
|
|
|
\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 );
|
|
|
|
//stan magazynowy
|
|
if ( $mdb -> count( 'pp_shop_products_stock', [ 'id_product' => $product_id ] ) )
|
|
$mdb -> update( 'pp_shop_products_stock', [ 'quantity' => $quantity ], [ 'id_product' => $product_id ] );
|
|
else
|
|
$mdb -> insert( 'pp_shop_products_stock', [ 'id_product' => $product_id, 'quantity' => $quantity ] );
|
|
|
|
foreach ( $name as $key => $val )
|
|
{
|
|
if ( $translation_id = $mdb -> get( 'pp_shop_products_langs', 'id', [ 'AND' => [ 'product_id' => $product_id, 'lang_id' => $key ] ] ) )
|
|
{
|
|
$current_seo_link = $mdb -> get( 'pp_shop_products_langs', 'seo_link', [ 'id' => $translation_id ] );
|
|
|
|
if ( $seo_link[$key] )
|
|
$new_seo_link = \S::seo( $seo_link[$key] );
|
|
else
|
|
$new_seo_link = \S::seo( 'p-' . $product_id . '-' . $name[$key] );
|
|
|
|
if ( $new_seo_link !== $current_seo_link )
|
|
{
|
|
if ( !$mdb -> count( 'pp_redirects', [ 'from' => $current_seo_link, 'to' => $new_seo_link, 'lang_id' => $key, 'product_id' => $product_id ] ) )
|
|
{
|
|
if ( $mdb -> count( 'pp_redirects', [ 'from' => $new_seo_link, 'to' => $current_seo_link, 'lang_id' => $key, 'product_id' => $product_id ] ) )
|
|
$mdb -> delete( 'pp_redirects', [ 'from' => $new_seo_link, 'to' => $current_seo_link, 'lang_id' => $key, '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' => $key, 'product_id' => $product_id ] );
|
|
else
|
|
$mdb -> delete( 'pp_redirects', [ 'product_id' => $product_id, 'lang_id' => $key ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
$mdb -> update( 'pp_shop_products_langs', [
|
|
'lang_id' => $key,
|
|
'name' => '' !== $name[$key] ? $name[$key] : null,
|
|
'short_description' => '' !== $short_description[$key] ? $short_description[$key] : null,
|
|
'description' => '' !== $description[$key] ? $description[$key] : null,
|
|
'meta_description' => '' !== $meta_description[$key] ? $meta_description[$key] : null,
|
|
'meta_keywords' => '' !== $meta_keywords[$key] ? $meta_keywords[$key] : null,
|
|
'seo_link' => \S::seo( $seo_link[$key] ) != '' ? \S::seo( $seo_link[$key] ) : \S::seo( 'p-' . $product_id . '-' . $name[$key] ),
|
|
'copy_from' => '' !== $copy_from[$key] ? $copy_from[$key] : null,
|
|
'warehouse_message_zero' => '' !== $warehouse_message_zero[$key] ? $warehouse_message_zero[$key] : null,
|
|
'warehouse_message_nonzero' => '' !== $warehouse_message_nonzero[$key] ? $warehouse_message_nonzero[$key] : null,
|
|
'tab_name_1' => '' !== $tab_name_1[$key] ? $tab_name_1[$key] : null,
|
|
'tab_description_1' => '' !== $tab_description_1[$key] ? $tab_description_1[$key] : null,
|
|
'tab_name_2' => '' !== $tab_name_2[$key] ? $tab_name_2[$key] : null,
|
|
'tab_description_2' => '' !== $tab_description_2[$key] ? $tab_description_2[$key] : null,
|
|
'canonical' => '' !== $canonical[$key] ? $canonical[$key] : null,
|
|
'meta_title' => '' !== $meta_title[$key] ? $meta_title[$key] : null,
|
|
'xml_name' => '' !== $xml_name[$key] ? $xml_name[$key] : null,
|
|
], [
|
|
'id' => $translation_id
|
|
] );
|
|
}
|
|
else
|
|
{
|
|
$mdb -> insert( 'pp_shop_products_langs', [
|
|
'product_id' => (int)$product_id,
|
|
'lang_id' => $key,
|
|
'name' => '' !== $name[$key] ? $name[$key] : null,
|
|
'short_description' => '' !== $short_description[$key] ? $short_description[$key] : null,
|
|
'description' => '' !== $description[$key] ? $description[$key] : null,
|
|
'meta_description' => '' !== $meta_description[$key] ? $meta_description[$key] : null,
|
|
'meta_keywords' => '' !== $meta_keywords[$key] ? $meta_keywords[$key] : null,
|
|
'seo_link' => '' !== \S::seo($seo_link[$key]) ? \S::seo($seo_link[$key]) : null,
|
|
'copy_from' => '' !== $copy_from[$key] ? $copy_from[$key] : null,
|
|
'warehouse_message_zero' => '' !== $warehouse_message_zero[$key] ? $warehouse_message_zero[$key] : null,
|
|
'warehouse_message_nonzero' => '' !== $warehouse_message_nonzero[$key] ? $warehouse_message_nonzero[$key] : null,
|
|
'tab_name_1' => '' !== $tab_name_1[$key] ? $tab_name_1[$key] : null,
|
|
'tab_description_1' => '' !== $tab_description_1[$key] ? $tab_description_1[$key] : null,
|
|
'tab_name_2' => '' !== $tab_name_2[$key] ? $tab_name_2[$key] : null,
|
|
'tab_description_2' => '' !== $tab_description_2[$key] ? $tab_description_2[$key] : null,
|
|
'canonical' => '' !== $canonical[$key] ? $canonical[$key] : null,
|
|
'meta_title' => '' !== $meta_title[$key] ? $meta_title[$key] : null,
|
|
'xml_name' => '' !== $xml_name[$key] ? $xml_name[$key] : 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;
|
|
|
|
$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[] = $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 ] ] );
|
|
|
|
foreach ( $custom_field_name as $custom_field )
|
|
{
|
|
if ( !empty( $custom_field ) )
|
|
{
|
|
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 ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
\S::htacces();
|
|
|
|
\S::delete_dir( '../temp/' );
|
|
\S::delete_dir( '../thumbs/' );
|
|
|
|
$redis = \RedisConnection::getInstance() -> getConnection();
|
|
$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'] ] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|