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( '&', '&', $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; } // 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 ); 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 and $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; 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[] = $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'] ] ); } } } } }