Files
pomysloweprezenty.pl/autoload/admin/factory/class.ShopProduct.php
Jacek Pyziak a475c87287 Refactor deleting product and updating SEO links
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.
2024-10-27 21:49:36 +01:00

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( '&', '&amp;', $product -> language['xml_name'] ) . ' - ' . $product -> generateSubtitleFromAttributes( $product_combination -> permutation_hash ) ) );
else
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['name'] ) . ' - ' . $product -> generateSubtitleFromAttributes( $product_combination -> permutation_hash ) ) );
if ( $product -> ean )
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', $product -> ean ) );
else
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', self::generate_EAN( $product -> id ) ) );
// opis produktu
if ( $product -> language['short_description'] )
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['short_description'] ) ) ) );
else
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['name'] ) ) ) );
if ( $product -> language['seo_link'] )
$link = $domain_prefix . '://' . $url . '/' . \S::seo( $product -> language['seo_link'] ) . '/' . str_replace( '|', '/', $product_combination -> permutation_hash );
else
$link = $domain_prefix . '://' . $url . '/' . 'p-' . $product -> id . '-' . \S::seo( $product -> language['name'] ) . '/' . str_replace( '|', '/', $product_combination -> permutation_hash );
$p_link = $itemNode -> appendChild( $doc -> createElement( 'link', $link ) );
if ( $product -> images[0] )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:image_link', $domain_prefix . '://' . $url . $product -> images[0]['src'] ) );
if ( count( $product -> images ) > 1 )
{
for ( $i = 1; $i < count( $product -> images ); ++$i )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:additional_image_link', $domain_prefix . '://' . $url . $product -> images[$i]['src'] ) );
}
$p_gcondition = $itemNode -> appendChild( $doc -> createElement( 'g:condition', 'new' ) );
if ( $product_combination -> quantity !== null )
{
if ( $product_combination -> quantity > 0 )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product_combination -> quantity ) );
}
else
{
if ( $product_combination -> stock_0_buy )
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
else
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
}
}
else
{
if ( $product -> quantity > 0 )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product -> quantity ) );
}
else
{
if ( $product -> stock_0_buy )
{
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 999 ) );
}
else
{
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 0 ) );
}
}
}
if ( $product_combination -> price_brutto )
{
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product_combination -> price_brutto . ' PLN' ) );
if ( $product_combination -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product_combination -> price_brutto_promo . ' PLN' ) );
}
else
{
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product -> price_brutto . ' PLN' ) );
if ( $product -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product -> price_brutto_promo . ' PLN' ) );
}
$p_gshipping = $itemNode -> appendChild( $doc -> createElement( 'g:shipping' ) );
$p_gcountry = $p_gshipping -> appendChild( $doc -> createElement( 'g:country', 'PL' ) );
$p_gservice = $p_gshipping -> appendChild( $doc -> createElement( 'g:service', '1 dzień roboczy' ) );
$p_gprice = $p_gshipping -> appendChild( $doc -> createElement( 'g:price', \admin\factory\ShopTransport::lowest_transport_price( (int) $product -> wp ) . ' PLN' ) );
}
}
}
else
{
$itemNode = $channelNode -> appendChild( $doc -> createElement( 'item' ) );
$p_gid = $itemNode -> appendChild( $doc -> createElement('g:id', $product -> id ) );
$p_groupid = $itemNode -> appendChild( $doc -> createElement( 'g:item_group_id', $product -> id ) );
if ( $product -> google_xml_label )
$p_label = $itemNode -> appendChild($doc -> createElement('g:custom_label_0', $product -> google_xml_label ) );
if ( $product -> language['xml_name'] )
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['xml_name'] ) ) );
else
$p_title = $itemNode -> appendChild( $doc -> createElement( 'title', str_replace( '&', '&amp;', $product -> language['name'] ) ) );
if ( $product -> ean )
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', $product -> ean ) );
else
$p_gtin = $itemNode -> appendChild( $doc -> createElement( 'g:gtin', self::generate_EAN( $product -> id ) ) );
// opis produktu
if ( $product -> language['short_description'] )
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['short_description'] ) ) ) );
else
$p_description = $itemNode -> appendChild( $doc -> createElement( 'g:description', html_entity_decode( strip_tags( $product -> language['name'] ) ) ) );
if ( $product -> language['seo_link'] )
$link = $domain_prefix . '://' . $url . '/' . \S::seo( $product -> language['seo_link'] );
else
$link = $domain_prefix . '://' . $url . '/' . 'p-' . $product -> id . '-' . \S::seo( $product -> language['name'] );
$p_link = $itemNode -> appendChild( $doc -> createElement( 'link', $link ) );
if ( $product -> custom_label_0 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_0', $product -> custom_label_0 ) );
if ( $product -> custom_label_1 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_1', $product -> custom_label_1 ) );
if ( $product -> custom_label_2 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_2', $product -> custom_label_2 ) );
if ( $product -> custom_label_3 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_3', $product -> custom_label_3 ) );
if ( $product -> custom_label_4 )
$p_label = $itemNode -> appendChild( $doc -> createElement('g:custom_label_4', $product -> custom_label_4 ) );
if ( $product -> images[0] )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:image_link', $domain_prefix . '://' . $url . $product -> images[0]['src'] ) );
if ( count( $product -> images ) > 1 )
{
for ( $i = 1; $i < count( $product -> images ); ++$i )
$p_gimage_link = $itemNode -> appendChild( $doc -> createElement( 'g:additional_image_link', $domain_prefix . '://' . $url . $product -> images[$i]['src'] ) );
}
$p_gcondition = $itemNode -> appendChild( $doc -> createElement( 'g:condition', 'new' ) );
if ( $product -> quantity )
{
$p_gavailability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', $product -> quantity ) );
}
else
{
if ( $product -> stock_0_buy ) {
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'in stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 999 ) );
}
else {
$p_availability = $itemNode -> appendChild( $doc -> createElement( 'g:availability', 'out of stock' ) );
$p_gquantity = $itemNode -> appendChild( $doc -> createElement( 'g:quantity', 0 ) );
}
}
$p_gprice = $itemNode -> appendChild( $doc -> createElement( 'g:price', $product -> price_brutto . ' PLN' ) );
if ( $product -> price_brutto_promo )
$p_gsale_price = $itemNode -> appendChild( $doc -> createElement( 'g:sale_price', $product -> price_brutto_promo . ' PLN' ) );
$p_gshipping = $itemNode -> appendChild( $doc -> createElement( 'g:shipping' ) );
$p_gcountry = $p_gshipping -> appendChild( $doc -> createElement( 'g:country', 'PL' ) );
$p_gservice = $p_gshipping -> appendChild( $doc -> createElement( 'g:service', '1 dzień roboczy' ) );
$p_gprice = $p_gshipping -> appendChild( $doc -> createElement( 'g:price', \admin\factory\ShopTransport::lowest_transport_price( (int) $product -> wp ) . ' PLN' ) );
}
}
file_put_contents('../google-feed.xml', $doc -> saveXML());
}
static public function count_product_combinations( int $product_id )
{
global $mdb;
return $mdb -> count( 'pp_shop_products', [ 'parent_id' => $product_id ] );
}
// ajax_products_list
static public function ajax_products_list_archive( $current_page = null, $query = null )
{
global $mdb;
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'] ] );
}
}
}
}
}