示例#1
0
function ls_get_fav_data()
{
    //wishlist products footer carousel
    $_SESSION['wishlist'] = isset($_SESSION['wishlist']) ? $_SESSION['wishlist'] : array();
    $wishlist =& $_SESSION['wishlist'];
    $_SESSION['continue_url'] = fn_ls_get_base_url();
    $auth =& $_SESSION['auth'];
    //view products
    $products_footer = !empty($wishlist['products']) ? $wishlist['products'] : array();
    $extra_products = array();
    $wishlist_is_empty = fn_cart_is_empty($wishlist);
    if (!empty($products_footer)) {
        foreach ($products_footer as $k => $v) {
            $_options = array();
            $extra = $v['extra'];
            if (!empty($v['product_options'])) {
                $_options = $v['product_options'];
            }
            $products_footer[$k] = fn_get_product_data($v['product_id'], $auth, CART_LANGUAGE, '', true, true, true, false, false, true, false, true);
            if (empty($products_footer[$k])) {
                unset($products_footer[$k], $wishlist['products'][$k]);
                continue;
            }
            $products_footer[$k]['extra'] = empty($products_footer[$k]['extra']) ? array() : $products_footer[$k]['extra'];
            $products_footer[$k]['extra'] = array_merge($products_footer[$k]['extra'], $extra);
            if (isset($products_footer[$k]['extra']['product_options']) || $_options) {
                $products_footer[$k]['selected_options'] = empty($products_footer[$k]['extra']['product_options']) ? $_options : $products_footer[$k]['extra']['product_options'];
            }
            if (!empty($products_footer[$k]['selected_options'])) {
                $options = fn_get_selected_product_options($v['product_id'], $v['product_options'], CART_LANGUAGE);
                foreach ($products_footer[$k]['selected_options'] as $option_id => $variant_id) {
                    foreach ($options as $option) {
                        if ($option['option_id'] == $option_id && !in_array($option['option_type'], array('I', 'T', 'F')) && empty($variant_id)) {
                            $products_footer[$k]['changed_option'] = $option_id;
                            break 2;
                        }
                    }
                }
            }
            $products_footer[$k]['display_subtotal'] = $products_footer[$k]['price'] * $v['amount'];
            $products_footer[$k]['display_amount'] = $v['amount'];
            $products_footer[$k]['cart_id'] = $k;
            if (!empty($products_footer[$k]['extra']['parent'])) {
                $extra_products[$k] = $products_footer[$k];
                unset($products_footer[$k]);
                continue;
            }
        }
    }
    fn_gather_additional_products_data($products_footer, array('get_icon' => true, 'get_detailed' => true, 'get_options' => true, 'get_discounts' => true));
    return $products_footer;
}
function fn_exim_get_product_combination($product_id, $combination, $set_delimiter, $lang_code = CART_LANGUAGE)
{
    $selected_options = fn_get_product_options_by_combination($combination);
    $options = fn_get_selected_product_options($product_id, $selected_options, $lang_code);
    $return = array();
    if (!empty($options)) {
        foreach ($options as $option) {
            if (isset($selected_options[$option['option_id']])) {
                $return[] = $option['option_name'] . ': ' . $option['variants'][$selected_options[$option['option_id']]]['variant_name'];
            }
        }
    }
    return implode($set_delimiter, $return);
}
示例#3
0
 $extra = $v['extra'];
 if (!empty($v['product_options'])) {
     $_options = $v['product_options'];
 }
 $products_footer[$k] = fn_get_product_data($v['product_id'], $auth, CART_LANGUAGE, '', true, true, true, false, false, true, false, true);
 if (empty($products_footer[$k])) {
     unset($products_footer[$k], $wishlist['products'][$k]);
     continue;
 }
 $products_footer[$k]['extra'] = empty($products_footer[$k]['extra']) ? array() : $products_footer[$k]['extra'];
 $products_footer[$k]['extra'] = array_merge($products_footer[$k]['extra'], $extra);
 if (isset($products_footer[$k]['extra']['product_options']) || $_options) {
     $products_footer[$k]['selected_options'] = empty($products_footer[$k]['extra']['product_options']) ? $_options : $products_footer[$k]['extra']['product_options'];
 }
 if (!empty($products_footer[$k]['selected_options'])) {
     $options = fn_get_selected_product_options($v['product_id'], $v['product_options'], CART_LANGUAGE);
     foreach ($products_footer[$k]['selected_options'] as $option_id => $variant_id) {
         foreach ($options as $option) {
             if ($option['option_id'] == $option_id && !in_array($option['option_type'], array('I', 'T', 'F')) && empty($variant_id)) {
                 $products_footer[$k]['changed_option'] = $option_id;
                 break 2;
             }
         }
     }
 }
 $products_footer[$k]['display_subtotal'] = $products_footer[$k]['price'] * $v['amount'];
 $products_footer[$k]['display_amount'] = $v['amount'];
 $products_footer[$k]['cart_id'] = $k;
 /* $products_footer[$k]['product_options'] = fn_get_selected_product_options($v['product_id'], $v['product_options'], CART_LANGUAGE);
    $products_footer[$k]['price'] = fn_apply_options_modifiers($v['product_options'], $products_footer[$k]['price'], 'P'); */
 if (!empty($products_footer[$k]['extra']['parent'])) {
示例#4
0
文件: func.php 项目: arpad9/bygmarket
function fn_twg_get_api_product_data($product_id, $lang_code = CART_LANGUAGE)
{
    $auth =& $_SESSION['auth'];
    $get_features = $get_discounts = $get_options = AREA == 'C';
    $product = fn_get_product_data($product_id, $auth, $lang_code, '', true, true, true, $get_discounts, false, $get_features, null, true);
    if (empty($product)) {
        return array();
    }
    $product['main_product_code'] = $product['product_code'];
    fn_gather_additional_product_data($product, true, true, $get_options, $get_discounts);
    // Delete empty product feature groups
    if ($get_features && !empty($product['product_features'])) {
        foreach ($product['product_features'] as $feature_id => $feature) {
            if ($feature['feature_type'] == 'G' and empty($feature['subfeatures'])) {
                unset($product['product_features'][$feature_id]);
            }
        }
    }
    $product['product_options'] = array();
    $product_options = fn_twg_api_get_product_options($product);
    if (!empty($product['combination'])) {
        $selected_options = fn_get_product_options_by_combination($product['combination']);
        $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, $lang_code) : $product_options[$product_id];
    }
    $product['product_options'] = $product_options;
    foreach ($product['product_options'] as $key1 => $val1) {
        $option_descriptions = db_get_row("SELECT option_name, option_text, description, comment\n             FROM ?:product_options_descriptions\n             WHERE option_id = ?i AND lang_code = ?s", $val1['option_id'], $lang_code);
        foreach ($option_descriptions as $key2 => $val2) {
            $product['product_options'][$key1][$key2] = $val2;
        }
        $val1['variants'] = isset($val1['variants']) ? $val1['variants'] : array();
        foreach (array_keys($val1['variants']) as $vid) {
            if ($val1['option_type'] == 'C') {
                $product['product_options'][$key1]['variants'][$vid]['variant_name'] = empty($val1['position']) ? __('no', $lang_code) : __('yes', $lang_code);
            } elseif ($val1['option_type'] == 'S' || $val1['option_type'] == 'R') {
                $variant_description = db_get_field("SELECT variant_name\n                     FROM ?:product_option_variants_descriptions\n                     WHERE variant_id = ?i AND lang_code = ?s", $vid, $lang_code);
                $product['product_options'][$key1]['variants'][$vid]['variant_name'] = $variant_description;
            }
        }
    }
    $product['category_id'] = $product['main_category'];
    $product['images'] = array();
    $images_config = TwigmoSettings::get('images');
    $image_params = $images_config['big'];
    if (!empty($product['main_pair'])) {
        $product['icon'] = TwigmoImage::getApiImageData($product['main_pair'], 'product', 'icon', $images_config['prewiew']);
        $product['images'][] = TwigmoImage::getApiImageData($product['main_pair'], 'product', 'detailed', $image_params);
    }
    foreach ($product['image_pairs'] as $v) {
        $product['images'][] = TwigmoImage::getApiImageData($v, 'product', 'detailed', $image_params);
    }
    $product['category'] = db_get_field("SELECT category FROM ?:category_descriptions WHERE category_id = ?i AND lang_code = ?s", $product['main_category'], $lang_code);
    $product['product_options_exceptions'] = fn_twg_get_api_product_options_exceptions($product_id);
    $product['product_options_inventory'] = fn_twg_get_api_product_options_inventory($product_id, $lang_code);
    $_product = Api::getAsApiObject('products', $product);
    $_product['avail_since_formated'] = strftime(Registry::get('settings.Appearance.date_format'), $_product['avail_since']);
    $_product['TIME'] = TIME;
    if (AREA == 'C') {
        $_product['tabs'] = fn_twg_get_product_tabs(array('product_id' => $product_id, 'descr_sl' => DESCR_SL));
    }
    $_product['default_image'] = fn_get_image_pairs($product_id, 'product', 'M', true, true);
    if (!empty($product['points_info'])) {
        $_product['points_info'] = $product['points_info'];
    }
    return $_product;
}
示例#5
0
 protected function buildOfferCombination($product, $combination)
 {
     $this->offer['items']['param'] = $this->params;
     $skip = false;
     foreach ($combination['combination'] as $option_id => $variant_id) {
         if (!isset($product['product_options'][$option_id]['variants'][$variant_id])) {
             $skip = true;
             break;
         }
     }
     if ($this->options['export_stock'] == 'Y') {
         if ($product['tracking'] == 'O' && $combination['amount'] <= 0) {
             $this->log->write(Logs::SKIP_PRODUCT, $product, __('yml2_log_product_amount_combination_is_empty'));
             $skip = true;
         }
     }
     if ($skip) {
         return false;
     }
     if ($product['tracking'] == 'O' && $combination['amount'] <= 0) {
         $this->offer['attr']['available'] = 'false';
     }
     $product['images'][] = $combination['image_pairs'];
     while ($image = array_shift($product['images'])) {
         $offer['items']['picture'][] = $this->getImageUrl($image);
     }
     $this->offer['items']['price'] = fn_apply_options_modifiers($combination['combination'], $this->offer['items']['price'], 'P');
     $combination_hash = array();
     foreach ($combination['combination'] as $option_id => $variant_id) {
         $combination_hash[] = $option_id;
         $combination_hash[] = $variant_id;
     }
     $this->offer['items']['url'] = $this->escapeUrl('products.view?product_id=' . $product['product_id'] . '&combination=' . implode('_', $combination_hash));
     $options = fn_get_selected_product_options($product['product_id'], $combination['combination']);
     if (!empty($combination['product_code']) && isset($this->offer['items']['vendorCode']) && $this->offer['items']['vendorCode'] == $product['product_code']) {
         $this->offer['items']['vendorCode'] = $combination['product_code'];
     }
     foreach ($options as $option) {
         if (!empty($option['yml2_type_options'])) {
             $this->setOfferOptions($option);
         }
     }
     $this->offer['attr']['id'] = $this->generateNewId($options);
     sort($this->offer['items']['param']);
     return true;
 }
示例#6
0
} elseif ($mode == 'view') {
    $product = $view->get_var('product');
    $product['configuration_mode'] = true;
    if (!empty($product) && $product['product_type'] == 'C') {
        if (!empty($_REQUEST['cart_id'])) {
            $cart =& $_SESSION['cart'];
            if (isset($cart['products'][$_REQUEST['cart_id']]['extra'])) {
                $product['extra'] = $cart['products'][$_REQUEST['cart_id']]['extra'];
            }
            $view->assign('edit_configuration', $_REQUEST['cart_id']);
            $view->assign('cart_item', $cart['products'][$_REQUEST['cart_id']]);
            $selected_configuration = $cart['products'][$_REQUEST['cart_id']]['extra']['configuration'];
            // If product has options, select the appropriate
            // FIXME: duplicate selection, first was in gather_additional_product_data
            if (!empty($cart['products'][$_REQUEST['cart_id']]['product_options'])) {
                $product['product_options'] = fn_get_selected_product_options($product['product_id'], $cart['products'][$_REQUEST['cart_id']]['product_options'], CART_LANGUAGE);
            }
        }
        $product_configurator_steps = db_get_hash_array("SELECT ?:conf_steps.step_id, ?:conf_step_descriptions.step_name FROM ?:conf_steps LEFT JOIN ?:conf_step_descriptions ON ?:conf_steps.step_id = ?:conf_step_descriptions.step_id WHERE ?:conf_steps.status = 'A' AND ?:conf_step_descriptions.lang_code = ?s ORDER BY ?:conf_steps.position", 'step_id', CART_LANGUAGE);
        $current_step_id = 0;
        foreach ($product_configurator_steps as $step_id => $step_value) {
            $product_configurator_groups = db_get_array("SELECT ?:conf_groups.group_id, ?:conf_group_descriptions.configurator_group_name, ?:conf_group_descriptions.full_description, ?:conf_groups.configurator_group_type, ?:conf_product_groups.position, ?:conf_product_groups.default_product_ids, ?:conf_product_groups.required FROM ?:conf_groups LEFT JOIN ?:conf_group_descriptions ON ?:conf_group_descriptions.group_id = ?:conf_groups.group_id LEFT JOIN ?:conf_product_groups ON ?:conf_product_groups.group_id = ?:conf_groups.group_id  WHERE ?:conf_groups.status = 'A' AND ?:conf_group_descriptions.lang_code = ?s AND ?:conf_product_groups.product_id = ?i AND ?:conf_groups.step_id = ?i ORDER BY ?:conf_product_groups.position", CART_LANGUAGE, $product['product_id'], $step_id);
            $price_usergroup = db_quote(" AND ?:product_prices.usergroup_id IN (?n)", array_merge(array(USERGROUP_ALL), $auth['usergroup_ids']));
            if (!empty($product_configurator_groups)) {
                $c_price = 0;
                $where = $join = '';
                if (Registry::get('settings.General.show_out_of_stock_products') == 'N') {
                    $join = " LEFT JOIN ?:product_options_inventory as inventory ON inventory.product_id = ?:products.product_id";
                    $where = " AND IF(?:products.tracking = 'O', inventory.amount > 0, ?:products.amount > 0)";
                }
                foreach ($product_configurator_groups as $k => $v) {
示例#7
0
* and use this program.                                                    *
*                                                                          *
****************************************************************************
* PLEASE READ THE FULL TEXT  OF THE SOFTWARE  LICENSE   AGREEMENT  IN  THE *
* "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE.            *
****************************************************************************/
//
// $Id: products.pre.php 10229 2010-07-27 14:21:39Z 2tl $
//
if (!defined('AREA')) {
    die('Access denied');
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if ($mode == 'options') {
        if (!empty($_REQUEST['event_products']) && !empty($_REQUEST['appearance']['events'])) {
            $event_data['products'] = db_get_hash_array("SELECT * FROM ?:giftreg_event_products LEFT JOIN ?:product_descriptions ON ?:product_descriptions.product_id = ?:giftreg_event_products.product_id AND ?:product_descriptions.lang_code = ?s WHERE event_id = ?i", 'item_id', CART_LANGUAGE, $_REQUEST['appearance']['event_id']);
            foreach ($event_data['products'] as $k => $v) {
                $event_data['products'][$k]['extra'] = $event_data['products'][$k]['selected_options'] = @$_REQUEST['event_products'][$k]['product_options'];
                $product_options = $event_data['products'][$k]['extra'];
                $event_data['products'][$k]['product_options'] = fn_get_selected_product_options($v['product_id'], $product_options, CART_LANGUAGE);
                $event_data['products'][$k]['original_price'] = $event_data['products'][$k]['price'] = fn_get_product_price($v['product_id'], 1, $auth);
                $event_data['products'][$k]['avail_amount'] = $v['amount'] - $v['ordered_amount'];
                fn_gather_additional_product_data($event_data['products'][$k], true, false, true, true);
            }
            $view->assign('event_id', $_REQUEST['appearance']['event_id']);
            $view->assign('event_data', $event_data);
            $view->display('addons/gift_registry/views/events/components/event_products.tpl');
            exit;
        }
    }
}
示例#8
0
     if (isset($_cart['products'][$cart_id])) {
         $amount = isset($item['amount']) ? $item['amount'] : 1;
         $product_data = fn_get_product_data($item['product_id'], $auth, CART_LANGUAGE, '', false, false, false, false, false, false, false);
         if ($product_data['options_type'] == 'S' && isset($item['product_options']) && isset($_REQUEST['changed_option'][$cart_id])) {
             $item['product_options'] = fn_fill_sequential_options($item, $_REQUEST['changed_option'][$cart_id]);
             unset($_REQUEST['changed_option']);
         }
         $product_options = isset($item['product_options']) ? $item['product_options'] : array();
         $amount = fn_check_amount_in_stock($item['product_id'], $amount, $product_options, $cart_id, $_cart['products'][$cart_id]['is_edp'], 0, $_cart);
         if ($amount === false) {
             unset($_cart['products'][$cart_id]);
             continue;
         }
         $_cart['products'][$cart_id]['amount'] = $amount;
         $_cart['products'][$cart_id]['selected_options'] = isset($item['product_options']) ? $item['product_options'] : array();
         $_cart['products'][$cart_id]['product_options'] = fn_get_selected_product_options($item['product_id'], $_cart['products'][$cart_id]['selected_options']);
         $_cart['products'][$cart_id] = fn_apply_options_rules($_cart['products'][$cart_id]);
         $_cart['products'][$cart_id]['product_options'] = $_cart['products'][$cart_id]['selected_options'];
         if (!empty($_cart['products'][$cart_id]['extra']['saved_options_key'])) {
             $_cart['saved_product_options'][$_cart['products'][$cart_id]['extra']['saved_options_key']] = $_cart['products'][$cart_id]['product_options'];
         }
         if (!empty($item['object_id'])) {
             $_cart['products'][$cart_id]['object_id'] = $item['object_id'];
             if (!empty($_cart['products'][$cart_id]['extra']['saved_options_key'])) {
                 // Product from promotion. Save object_id for this product
                 $_cart['saved_object_ids'][$_cart['products'][$cart_id]['extra']['saved_options_key']] = $item['object_id'];
             }
         }
     }
 }
 fn_set_hook('calculate_options', $cart_products, $_cart, $auth);
示例#9
0
function fn_look_through_variants_prices($product_id, $options, $variants)
{
    $product = fn_get_product_data($product_id, $_SESSION['auth'], CART_LANGUAGE, '', true, true, true, true, $auth['area'] == 'A' && !empty($_REQUEST['action']) && $_REQUEST['action'] == 'preview');
    $product['product_options'] = fn_get_product_options(array($product_id), CART_LANGUAGE);
    $product = fn_apply_options_rules($product);
    //var_dump($product['product_options']);
    $position = 0;
    $hashes = array();
    $combinations = fn_get_options_combinations($options, $variants);
    //var_dump($combinations);
    foreach ($combinations as $key => $combination) {
        $flagToUnsetArrayElement = 0;
        $productArrayOtionsVariants = fn_get_options_variants_by_option_variant_id($product_id, $combination);
        foreach ($combination as $optionId => $variantId) {
            if ($productArrayOtionsVariants[$optionId] && !in_array($variantId, $productArrayOtionsVariants[$optionId])) {
                $flagToUnsetArrayElement = 1;
            }
        }
        if ($flagToUnsetArrayElement == 1) {
            unset($combinations[$key]);
        }
    }
    //var_dump($combinations);
    if (!empty($combinations)) {
        foreach ($combinations as $combination) {
            $_data = array();
            $_data['product_id'] = $product_id;
            $_data['combination_hash'] = fn_generate_cart_id($product_id, array('product_options' => $combination));
            if (array_search($_data['combination_hash'], $hashes) === false) {
                $hashes[] = $_data['combination_hash'];
                $_data['combination'] = fn_get_options_combination($combination);
                $product['product_options'] = fn_get_selected_product_options($product['product_id'], $combination, CART_LANGUAGE);
                $product = fn_apply_options_rules($product);
                $_data['price'] = fn_calculate_price_of_a_product($product, $combination);
                $old_data = db_get_row("SELECT combination_hash, price " . "FROM ?:product_options_inventory_prices " . "WHERE product_id = ?i AND combination_hash = ?i AND temp = 1", $product_id, $_data['combination_hash']);
                /**
                 * Changes data before update combination
                 *
                 * @param array $combination Array of combination data
                 * @param array $data Combination data to update
                 * @param int $product_id Product identifier
                 * @param int $amount Default combination amount
                 * @param array $options Array of options identifiers
                 * @param array $variants Array of option variants identifiers arrays in order corresponding to $options parameter
                 */
                db_query("REPLACE INTO ?:product_options_inventory_prices ?e", $_data);
                $combinations[] = $combination;
            }
            echo str_repeat('. ', count($combination));
        }
    }
}
示例#10
0
/**
 * Gets displayable product data to show it in the cart
 *
 * @param string $hash Unique product HASH
 * @param array &$product Product data
 * @param bool $skip_promotion Skip promotion calculation
 * @param array &$cart Array of cart content and user information necessary for purchase
 * @param array &$auth Array with authorization data
 * @param array $promotion_amount Amount of product in promotion (like Free products, etc)
 * @return array Product data
 */
function fn_get_cart_product_data($hash, &$product, $skip_promotion, &$cart, &$auth, $promotion_amount = 0)
{
    /**
     * Prepare params before getting product data from cart
     *
     * @param string $hash Unique product HASH
     * @param array &$product Product data
     * @param bool $skip_promotion Skip promotion calculation
     * @param array &$cart Array of cart content and user information necessary for purchase
     * @param array &$auth Array with authorization data
     * @param array $promotion_amount Amount of product in promotion (like Free products, etc)
     */
    fn_set_hook('get_cart_product_data_pre', $hash, $product, $skip_promotion, $cart, $auth, $promotion_amount);
    if (!empty($product['product_id'])) {
        $fields = array('?:products.product_id', '?:products.company_id', "GROUP_CONCAT(IF(?:products_categories.link_type = 'M', CONCAT(?:products_categories.category_id, 'M'), ?:products_categories.category_id)) as category_ids", '?:products.product_code', '?:products.weight', '?:products.tracking', '?:product_descriptions.product', '?:product_descriptions.short_description', '?:products.is_edp', '?:products.edp_shipping', '?:products.shipping_freight', '?:products.free_shipping', '?:products.zero_price_action', '?:products.tax_ids', '?:products.qty_step', '?:products.list_qty_count', '?:products.max_qty', '?:products.min_qty', '?:products.amount as in_stock', '?:products.shipping_params', '?:companies.status as company_status', '?:companies.company as company_name');
        $join = db_quote("LEFT JOIN ?:product_descriptions ON ?:product_descriptions.product_id = ?:products.product_id AND ?:product_descriptions.lang_code = ?s", CART_LANGUAGE);
        $_p_statuses = array('A', 'H');
        $_c_statuses = array('A', 'H');
        $avail_cond = '';
        if (fn_allowed_for('ULTIMATE') && Registry::get('runtime.company_id')) {
            if (AREA == 'C') {
                $avail_cond .= fn_get_company_condition('?:categories.company_id');
            } else {
                $avail_cond .= ' AND (' . fn_get_company_condition('?:categories.company_id', false) . ' OR ' . fn_get_company_condition('?:products.company_id', false) . ')';
            }
        }
        $avail_cond .= AREA == 'C' ? " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:categories.usergroup_ids', true) . ")" : '';
        $avail_cond .= AREA == 'C' ? " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:products.usergroup_ids', true) . ")" : '';
        $avail_cond .= AREA == 'C' && !(isset($auth['area']) && $auth['area'] == 'A') ? db_quote(' AND ?:categories.status IN (?a) AND ?:products.status IN (?a)', $_c_statuses, $_p_statuses) : '';
        $avail_cond .= AREA == 'C' ? fn_get_localizations_condition('?:products.localization') : '';
        $join .= " INNER JOIN ?:products_categories ON ?:products_categories.product_id = ?:products.product_id INNER JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id {$avail_cond}";
        $join .= " LEFT JOIN ?:companies ON ?:companies.company_id = ?:products.company_id";
        fn_set_hook('pre_get_cart_product_data', $hash, $product, $skip_promotion, $cart, $auth, $promotion_amount, $fields, $join);
        $_pdata = db_get_row("SELECT " . implode(', ', $fields) . " FROM ?:products ?p WHERE ?:products.product_id = ?i GROUP BY ?:products.product_id", $join, $product['product_id']);
        // delete product from cart if vendor was disabled.
        if (empty($_pdata) || !empty($_pdata['company_id']) && !defined('ORDER_MANAGEMENT') && $_pdata['company_status'] != 'A') {
            fn_delete_cart_product($cart, $hash);
            return false;
        }
        if (!empty($_pdata['category_ids'])) {
            list($_pdata['category_ids'], $_pdata['main_category']) = fn_convert_categories($_pdata['category_ids']);
        } else {
            $_pdata['category_ids'] = array();
        }
        $_pdata['options_count'] = db_get_field("SELECT COUNT(*) FROM ?:product_options WHERE product_id = ?i AND status = 'A'", $product['product_id']);
        $amount = !empty($product['amount_total']) ? $product['amount_total'] : $product['amount'];
        $_pdata['price'] = fn_get_product_price($product['product_id'], $amount, $auth);
        $_pdata['base_price'] = isset($product['stored_price']) && $product['stored_price'] == 'Y' ? $product['price'] : $_pdata['price'];
        fn_set_hook('get_cart_product_data', $product['product_id'], $_pdata, $product, $auth, $cart, $hash);
        $product['stored_price'] = empty($product['stored_price']) ? 'N' : $product['stored_price'];
        $product['stored_discount'] = empty($product['stored_discount']) ? 'N' : $product['stored_discount'];
        $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
        if (empty($_pdata['product_id'])) {
            // FIXME - for deleted products for OM
            fn_delete_cart_product($cart, $hash);
            return array();
        }
        if (!empty($_pdata['options_count']) && empty($product['product_options'])) {
            $cart['products'][$hash]['product_options'] = fn_get_default_product_options($product['product_id']);
        }
        if (Registry::get('settings.General.inventory_tracking') == 'Y' && !empty($_pdata['tracking']) && $_pdata['tracking'] == ProductTracking::TRACK_WITH_OPTIONS && !empty($product['selectable_cart_id'])) {
            $_pdata['in_stock'] = db_get_field("SELECT amount FROM ?:product_options_inventory WHERE combination_hash = ?i", $product['selectable_cart_id']);
        }
        $product['amount'] = fn_check_amount_in_stock($product['product_id'], $product['amount'], $product['product_options'], $hash, $_pdata['is_edp'], !empty($product['original_amount']) ? $product['original_amount'] : 0, $cart);
        if ($product['amount'] == 0) {
            fn_delete_cart_product($cart, $hash);
            $out_of_stock = true;
            return false;
        }
        if (!fn_allowed_for('ULTIMATE:FREE')) {
            $exceptions = fn_get_product_exceptions($product['product_id'], true);
            if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
                $product = array_merge($product, db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']));
            }
            if (!fn_is_allowed_options_exceptions($exceptions, $product['product_options'], $product['options_type'], $product['exceptions_type']) && !defined('GET_OPTIONS')) {
                fn_set_notification('E', __('notice'), __('product_options_forbidden_combination', array('[product]' => $_pdata['product'])));
                fn_delete_cart_product($cart, $hash);
                return false;
            }
            if (!fn_is_allowed_options($product)) {
                fn_set_notification('E', __('notice'), __('product_disabled_options', array('[product]' => $_pdata['product'])));
                fn_delete_cart_product($cart, $hash);
                return false;
            }
        }
        if (isset($product['extra']['custom_files'])) {
            $_pdata['extra']['custom_files'] = $product['extra']['custom_files'];
        }
        $_pdata['calculation'] = array();
        if (isset($product['extra']['exclude_from_calculate'])) {
            $_pdata['exclude_from_calculate'] = $product['extra']['exclude_from_calculate'];
            $_pdata['aoc'] = !empty($product['extra']['aoc']);
            $_pdata['price'] = 0;
        } else {
            if ($product['stored_price'] == 'Y') {
                $_pdata['price'] = $product['price'];
            }
        }
        $product['price'] = $_pdata['zero_price_action'] == 'A' && isset($product['custom_user_price']) ? $product['custom_user_price'] : floatval($_pdata['price']);
        $cart['products'][$hash]['price'] = $product['price'];
        $_pdata['original_price'] = $product['price'];
        if ($product['stored_price'] != 'Y' && !isset($product['extra']['exclude_from_calculate'])) {
            $_tmp = $product['price'];
            $product['price'] = fn_apply_options_modifiers($product['product_options'], $product['price'], 'P', array(), array('product_data' => $product));
            $product['modifiers_price'] = $_pdata['modifiers_price'] = $product['price'] - $_tmp;
            // modifiers
        } else {
            $product['modifiers_price'] = $_pdata['modifiers_price'] = 0;
        }
        if (isset($product['modifiers_price']) && $_pdata['zero_price_action'] == 'A') {
            $_pdata['base_price'] = $product['price'] - $product['modifiers_price'];
        }
        $_pdata['weight'] = fn_apply_options_modifiers($product['product_options'], $_pdata['weight'], 'W', array(), array('product_data' => $product));
        $_pdata['amount'] = $product['amount'];
        $_pdata['price'] = $_pdata['original_price'] = fn_format_price($product['price']);
        $_pdata['stored_price'] = $product['stored_price'];
        if ($cart['options_style'] == 'F') {
            $_pdata['product_options'] = fn_get_selected_product_options($product['product_id'], $product['product_options'], CART_LANGUAGE);
        } elseif ($cart['options_style'] == 'I') {
            $_pdata['product_options'] = fn_get_selected_product_options_info($product['product_options'], CART_LANGUAGE);
        } else {
            $_pdata['product_options'] = $product['product_options'];
        }
        fn_set_hook('get_cart_product_data_post_options', $product['product_id'], $_pdata, $product);
        if (($_pdata['free_shipping'] != 'Y' || AREA == 'A') && ($_pdata['is_edp'] != 'Y' || $_pdata['is_edp'] == 'Y' && $_pdata['edp_shipping'] == 'Y')) {
            $cart['shipping_required'] = true;
        }
        $cart['products'][$hash]['is_edp'] = !empty($_pdata['is_edp']) && $_pdata['is_edp'] == 'Y' ? 'Y' : 'N';
        $cart['products'][$hash]['edp_shipping'] = !empty($_pdata['edp_shipping']) && $_pdata['edp_shipping'] == 'Y' ? 'Y' : 'N';
        if (empty($cart['products'][$hash]['extra']['parent'])) {
            // count only products without parent
            if ($skip_promotion == true && !empty($promotion_amount)) {
                $cart['amount'] += $promotion_amount;
            } else {
                $cart['amount'] += $product['amount'];
            }
        }
        if ($skip_promotion == false) {
            if (empty($cart['order_id']) || !empty($cart['recalculate_catalog_promotions'])) {
                fn_promotion_apply('catalog', $_pdata, $auth);
            } else {
                if (isset($product['discount'])) {
                    $_pdata['discount'] = $product['discount'];
                    $_pdata['price'] -= $product['discount'];
                    if ($_pdata['price'] < 0) {
                        $_pdata['discount'] += $_pdata['price'];
                        $_pdata['price'] = 0;
                    }
                }
            }
            // apply discount to the product
            if (!empty($_pdata['discount'])) {
                $cart['use_discount'] = true;
            }
        }
        if (!empty($product['object_id'])) {
            $_pdata['object_id'] = $product['object_id'];
        }
        $_pdata['shipping_params'] = empty($_pdata['shipping_params']) ? array() : unserialize($_pdata['shipping_params']);
        $_pdata['stored_discount'] = $product['stored_discount'];
        $cart['products'][$hash]['modifiers_price'] = $product['modifiers_price'];
        $_pdata['subtotal'] = $_pdata['price'] * $product['amount'];
        $cart['original_subtotal'] += $_pdata['original_price'] * $product['amount'];
        $cart['subtotal'] += $_pdata['subtotal'];
        /**
         * Prepare params before getting product data from cart
         *
         * @param string $hash Unique product HASH
         * @param array &$product Product data
         * @param bool $skip_promotion Skip promotion calculation
         * @param array &$cart Array of cart content and user information necessary for purchase
         * @param array &$auth Array with authorization data
         * @param array $promotion_amount Amount of product in promotion (like Free products, etc)
         * @param array $promotion_amount Product data
         */
        fn_set_hook('get_cart_product_data_post', $hash, $product, $skip_promotion, $cart, $auth, $promotion_amount, $_pdata);
        return $_pdata;
    }
    return array();
}
示例#11
0
function fn_get_cart_product_data($hash, &$product, $skip_promotion, &$cart, &$auth, $promotion_amount = 0)
{
    if (!empty($product['product_id'])) {
        $_p_statuses = array('A', 'H');
        $_c_statuses = array('A', 'H');
        $avail_cond = AREA == 'C' ? " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:categories.usergroup_ids', true) . ")" : '';
        $avail_cond .= AREA == 'C' ? " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:products.usergroup_ids', true) . ")" : '';
        $avail_cond .= AREA == 'C' ? db_quote(' AND ?:categories.status IN (?a) AND ?:products.status IN (?a)', $_c_statuses, $_p_statuses) : '';
        $avail_cond .= AREA == 'C' ? fn_get_localizations_condition('?:products.localization') : '';
        $join = " INNER JOIN ?:products_categories ON ?:products_categories.product_id = ?:products.product_id INNER JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id {$avail_cond}";
        $_pdata = db_get_row("SELECT ?:products.product_id, ?:products.company_id, GROUP_CONCAT(IF(?:products_categories.link_type = 'M', CONCAT(?:products_categories.category_id, 'M'), ?:products_categories.category_id)) as category_ids, ?:products.product_code, ?:products.weight, ?:products.tracking, ?:product_descriptions.product, ?:product_descriptions.short_description, ?:products.is_edp, ?:products.edp_shipping, ?:products.shipping_freight, ?:products.free_shipping, ?:products.zero_price_action, ?:products.tax_ids, ?:products.qty_step, ?:products.list_qty_count, ?:products.max_qty, ?:products.min_qty, ?:products.amount as in_stock FROM ?:products LEFT JOIN ?:product_descriptions ON ?:product_descriptions.product_id = ?:products.product_id AND ?:product_descriptions.lang_code = ?s ?p WHERE ?:products.product_id = ?i GROUP BY ?:products.product_id", CART_LANGUAGE, $join, $product['product_id']);
        $companies =& Registry::get('s_companies');
        // delete product from cart if supplier or vendor was disabled.
        if (empty($_pdata) || !empty($_pdata['company_id']) && ($companies[$_pdata['company_id']]['status'] != 'A' || (PRODUCT_TYPE == 'PROFESSIONAL' || PRODUCT_TYPE == 'COMMUNITY') && Registry::get('settings.Suppliers.enable_suppliers') != 'Y')) {
            return false;
        }
        $_pdata['category_ids'] = fn_convert_categories($_pdata['category_ids']);
        $_pdata['options_count'] = db_get_field("SELECT COUNT(*) FROM ?:product_options WHERE product_id = ?i AND status = 'A'", $product['product_id']);
        $_pdata['price'] = fn_get_product_price($product['product_id'], $product['amount'], $auth);
        $_pdata['base_price'] = isset($product['stored_price']) && $product['stored_price'] == 'Y' ? $product['price'] : $_pdata['price'];
        fn_set_hook('get_cart_product_data', $product['product_id'], $_pdata, $product);
        $product['stored_price'] = empty($product['stored_price']) ? 'N' : $product['stored_price'];
        $product['stored_discount'] = empty($product['stored_discount']) ? 'N' : $product['stored_discount'];
        $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
        if (empty($_pdata['product_id'])) {
            // FIXME - for deleted products for OM
            unset($cart['products'][$hash]);
            return array();
        }
        if (!empty($_pdata['options_count']) && empty($product['product_options'])) {
            $cart['products'][$hash]['product_options'] = fn_get_default_product_options($product['product_id']);
        }
        if (Registry::get('settings.General.inventory_tracking') == 'Y' && !empty($_pdata['tracking']) && $_pdata['tracking'] == 'O' && !empty($product['selectable_cart_id'])) {
            $_pdata['in_stock'] = db_get_field("SELECT amount FROM ?:product_options_inventory WHERE combination_hash = ?i", $product['selectable_cart_id']);
        }
        if (fn_check_amount_in_stock($product['product_id'], $product['amount'], $product['product_options'], $hash, $_pdata['is_edp'], !empty($product['original_amount']) ? $product['original_amount'] : 0, $cart) == false) {
            unset($cart['products'][$hash]);
            $out_of_stock = true;
            return false;
        }
        $exceptions = fn_get_product_exceptions($product['product_id'], true);
        if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
            $product = array_merge($product, db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']));
        }
        if (!fn_is_allowed_options_exceptions($exceptions, $product['product_options'], $product['options_type'], $product['exceptions_type']) && !defined('GET_OPTIONS')) {
            fn_set_notification('E', fn_get_lang_var('notice'), str_replace('[product]', $_pdata['product'], fn_get_lang_var('product_options_forbidden_combination')));
            unset($cart['products'][$hash]);
            return false;
        }
        if (isset($product['extra']['custom_files'])) {
            $_pdata['extra']['custom_files'] = $product['extra']['custom_files'];
        }
        $_pdata['calculation'] = array();
        if (isset($product['extra']['exclude_from_calculate'])) {
            $_pdata['exclude_from_calculate'] = $product['extra']['exclude_from_calculate'];
            $_pdata['aoc'] = !empty($product['extra']['aoc']);
            $_pdata['price'] = 0;
        } else {
            if ($product['stored_price'] == 'Y') {
                $_pdata['price'] = $product['price'];
            }
        }
        // If price defined and zero price action allows add zero priced product to cart, get price from the database
        if (isset($_pdata['price']) && $_pdata['zero_price_action'] != 'A') {
            $product['price'] = floatval($_pdata['price']);
            $cart['products'][$hash]['price'] = $product['price'];
        }
        $_pdata['original_price'] = $product['price'];
        if ($product['stored_price'] != 'Y' && !isset($product['extra']['exclude_from_calculate'])) {
            if ($_pdata['zero_price_action'] != 'A' || $_pdata['zero_price_action'] == 'A' && empty($product['modifiers_price'])) {
                $_tmp = $product['price'];
                $product['price'] = fn_apply_options_modifiers($product['product_options'], $product['price'], 'P');
                $product['modifiers_price'] = $_pdata['modifiers_price'] = $product['price'] - $_tmp;
                // modifiers
            }
        } else {
            $product['modifiers_price'] = $_pdata['modifiers_price'] = 0;
        }
        if (isset($product['modifiers_price']) && $_pdata['zero_price_action'] == 'A') {
            $_pdata['base_price'] = $product['price'] - $product['modifiers_price'];
        }
        $_pdata['weight'] = fn_apply_options_modifiers($product['product_options'], $_pdata['weight'], 'W');
        $_pdata['amount'] = $product['amount'];
        $_pdata['price'] = $_pdata['original_price'] = fn_format_price($product['price']);
        $_pdata['stored_price'] = $product['stored_price'];
        if ($cart['options_style'] == 'F') {
            $_pdata['product_options'] = fn_get_selected_product_options($product['product_id'], $product['product_options'], CART_LANGUAGE);
        } elseif ($cart['options_style'] == 'I') {
            $_pdata['product_options'] = fn_get_selected_product_options_info($product['product_options'], CART_LANGUAGE);
        } else {
            $_pdata['product_options'] = $product['product_options'];
        }
        if (($_pdata['free_shipping'] != 'Y' || AREA == 'A') && ($_pdata['is_edp'] != 'Y' || $_pdata['is_edp'] == 'Y' && $_pdata['edp_shipping'] == 'Y')) {
            $cart['shipping_required'] = true;
        }
        $cart['products'][$hash]['is_edp'] = !empty($_pdata['is_edp']) && $_pdata['is_edp'] == 'Y' ? 'Y' : 'N';
        $cart['products'][$hash]['edp_shipping'] = !empty($_pdata['edp_shipping']) && $_pdata['edp_shipping'] == 'Y' ? 'Y' : 'N';
        if (empty($cart['products'][$hash]['extra']['parent'])) {
            // count only products without parent
            if ($skip_promotion == true && !empty($promotion_amount)) {
                $cart['amount'] += $promotion_amount;
            } else {
                $cart['amount'] += $product['amount'];
            }
        }
        if ($skip_promotion == false) {
            if (empty($cart['order_id'])) {
                fn_promotion_apply('catalog', $_pdata, $auth);
            } else {
                if (empty($product['original_discount'])) {
                    $product['original_discount'] = !empty($product['discount']) ? $product['discount'] : 0;
                    $cart['products'][$hash]['original_discount'] = $product['original_discount'];
                }
                if (isset($product['discount'])) {
                    $_pdata['discount'] = $product['discount'];
                    $_pdata['price'] -= $product['discount'];
                    if ($_pdata['price'] < 0) {
                        $_pdata['discount'] += $_pdata['price'];
                        $_pdata['price'] = 0;
                    }
                }
            }
            // apply discount to the product
            if (!empty($_pdata['discount'])) {
                $cart['use_discount'] = true;
            }
        }
        if (!empty($product['object_id'])) {
            $_pdata['object_id'] = $product['object_id'];
        }
        $_pdata['stored_discount'] = $product['stored_discount'];
        $cart['products'][$hash]['modifiers_price'] = $product['modifiers_price'];
        $_pdata['subtotal'] = $_pdata['price'] * $product['amount'];
        $cart['original_subtotal'] += $_pdata['original_price'] * $product['amount'];
        $cart['subtotal'] += $_pdata['subtotal'];
        return $_pdata;
    }
    return array();
}
示例#12
0
/**
 * Gets additional products data
 *
 * @param array $products Array with products
 * @param array $params Array of flags which determines which data should be gathered
 * @return array Array of products with additional information
 */
function fn_gather_additional_products_data(&$products, $params)
{
    /**
     * Change parameters for gathering additional products data
     *
     * @param array $products List of products
     * @param array $params   Parameters for gathering data
     */
    fn_set_hook('gather_additional_products_data_pre', $products, $params);
    if (empty($products)) {
        return;
    }
    // Set default values to input params
    $default_params = array('get_icon' => false, 'get_detailed' => false, 'get_additional' => false, 'get_options' => true, 'get_discounts' => true, 'get_features' => false, 'get_extra' => false, 'get_taxed_prices' => true, 'get_for_one_product' => !is_array(reset($products)) ? true : false, 'detailed_params' => true, 'features_display_on' => 'C');
    $params = array_merge($default_params, $params);
    $auth =& $_SESSION['auth'];
    $allow_negative_amount = Registry::get('settings.General.allow_negative_amount');
    $inventory_tracking = Registry::get('settings.General.inventory_tracking');
    if ($params['get_for_one_product']) {
        $products = array($products);
    }
    $product_ids = array();
    foreach ($products as $v) {
        $product_ids[] = $v['product_id'];
    }
    if ($params['get_icon'] || $params['get_detailed']) {
        $products_images = fn_get_image_pairs($product_ids, 'product', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
    }
    if ($params['get_additional']) {
        $additional_images = fn_get_image_pairs($product_ids, 'product', 'A', true, true, CART_LANGUAGE);
    }
    if ($params['get_options']) {
        $product_options = fn_get_product_options($product_ids, CART_LANGUAGE);
    } else {
        $has_product_options = db_get_hash_array("SELECT a.option_id, a.product_id FROM ?:product_options AS a WHERE a.product_id IN (?n) AND a.status = 'A'", 'product_id', $product_ids);
        $has_product_options_links = db_get_hash_array("SELECT c.option_id, c.product_id FROM ?:product_global_option_links AS c LEFT JOIN ?:product_options AS a ON a.option_id = c.option_id WHERE a.status = 'A' AND c.product_id IN (?n)", 'product_id', $product_ids);
    }
    /**
     * Changes before gathering additional products data
     *
     * @param array $product_ids               Array of product identifiers
     * @param array $params                    Parameteres for gathering data
     * @param array $products                  Array of products
     * @param mixed $auth                      Array of user authentication data
     * @param array $products_images           Array with product main images
     * @param array $additional_images         Array with product additional images
     * @param array $product_options           Array with product options
     * @param array $has_product_options       Array of flags determines if product has options
     * @param array $has_product_options_links Array of flags determines if product has option links
     */
    fn_set_hook('gather_additional_products_data_params', $product_ids, $params, $products, $auth, $products_images, $additional_images, $product_options, $has_product_options, $has_product_options_links);
    // foreach $products
    foreach ($products as &$_product) {
        $product = $_product;
        $product_id = $product['product_id'];
        // Get images
        if ($params['get_icon'] == true || $params['get_detailed'] == true) {
            if (empty($product['main_pair']) && !empty($products_images[$product_id])) {
                $product['main_pair'] = reset($products_images[$product_id]);
            }
        }
        if ($params['get_additional'] == true) {
            if (empty($product['image_pairs']) && !empty($additional_images[$product_id])) {
                $product['image_pairs'] = $additional_images[$product_id];
            }
        }
        if (!isset($product['base_price'])) {
            $product['base_price'] = $product['price'];
            // save base price (without discounts, etc...)
        }
        /**
         * Changes before gathering product options
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_options', $product, $auth, $params);
        // Convert product categories
        if (!empty($product['category_ids']) && !is_array($product['category_ids'])) {
            list($product['category_ids'], $product['main_category']) = fn_convert_categories($product['category_ids']);
        }
        $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options'];
        // Get product options
        if ($params['get_options'] && !empty($product_options[$product['product_id']])) {
            if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
                $types = db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']);
                $product['options_type'] = $types['options_type'];
                $product['exceptions_type'] = $types['exceptions_type'];
            }
            if (empty($product['product_options'])) {
                if (!empty($product['combination'])) {
                    $selected_options = fn_get_product_options_by_combination($product['combination']);
                }
                $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, CART_LANGUAGE) : $product_options[$product_id];
            }
            $product = fn_apply_options_rules($product);
            if (!empty($params['get_icon']) || !empty($params['get_detailed'])) {
                // Get product options images
                if (!empty($product['combination_hash']) && !empty($product['product_options'])) {
                    $image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
                    if (!empty($image)) {
                        $product['main_pair'] = $image;
                    }
                }
            }
            $product['has_options'] = !empty($product['product_options']);
            if (!fn_allowed_for('ULTIMATE:FREE')) {
                $product = fn_apply_exceptions_rules($product);
            }
            //var_dump($product['product_options']);die();
            //var_dump($selected_options);
            // Change price
            $selected_options = isset($product['selected_options']) ? $product['selected_options'] : array();
            foreach ($product['product_options'] as $option) {
                if (!empty($option['disabled'])) {
                    unset($selected_options[$option['option_id']]);
                }
            }
            $product['selected_options'] = $selected_options;
            if (empty($product['modifiers_price'])) {
                $product['base_modifier'] = fn_apply_options_modifiers($selected_options, $product['base_price'], 'P', array(), array('product_data' => $product));
                $old_price = $product['price'];
                $product['price'] = fn_apply_options_modifiers($selected_options, $product['price'], 'P', array(), array('product_data' => $product));
                if (empty($product['original_price'])) {
                    $product['original_price'] = $old_price;
                }
                $product['original_price'] = fn_apply_options_modifiers($selected_options, $product['original_price'], 'P', array(), array('product_data' => $product));
                $product['modifiers_price'] = $product['price'] - $old_price;
            }
            if (!empty($product['list_price'])) {
                $product['list_price'] = fn_apply_options_modifiers($selected_options, $product['list_price'], 'P', array(), array('product_data' => $product));
            }
            if (!empty($product['prices']) && is_array($product['prices'])) {
                foreach ($product['prices'] as $pr_k => $pr_v) {
                    $product['prices'][$pr_k]['price'] = fn_apply_options_modifiers($selected_options, $pr_v['price'], 'P', array(), array('product_data' => $product));
                }
            }
        } else {
            $product['has_options'] = !empty($has_product_options[$product_id]) || !empty($has_product_options_links[$product_id]) ? true : false;
            $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
        }
        unset($selected_options);
        /**
         * Changes before gathering product discounts
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_discounts', $product, $auth, $params);
        // Get product discounts
        if ($params['get_discounts'] && !isset($product['exclude_from_calculate'])) {
            fn_promotion_apply('catalog', $product, $auth);
            if (!empty($product['prices']) && is_array($product['prices'])) {
                $product_copy = $product;
                foreach ($product['prices'] as $pr_k => $pr_v) {
                    $product_copy['base_price'] = $product_copy['price'] = $pr_v['price'];
                    fn_promotion_apply('catalog', $product_copy, $auth);
                    $product['prices'][$pr_k]['price'] = $product_copy['price'];
                }
            }
            if (empty($product['discount']) && !empty($product['list_price']) && !empty($product['price']) && floatval($product['price']) && $product['list_price'] > $product['price']) {
                $product['list_discount'] = fn_format_price($product['list_price'] - $product['price']);
                $product['list_discount_prc'] = sprintf('%d', round($product['list_discount'] * 100 / $product['list_price']));
            }
        }
        // FIXME: old product options scheme
        $product['discounts'] = array('A' => 0, 'P' => 0);
        if (!empty($product['promotions'])) {
            foreach ($product['promotions'] as $v) {
                foreach ($v['bonuses'] as $a) {
                    if ($a['discount_bonus'] == 'to_fixed') {
                        $product['discounts']['A'] += $a['discount'];
                    } elseif ($a['discount_bonus'] == 'by_fixed') {
                        $product['discounts']['A'] += $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'to_percentage') {
                        $product['discounts']['P'] += 100 - $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'by_percentage') {
                        $product['discounts']['P'] += $a['discount_value'];
                    }
                }
            }
        }
        // Add product prices with taxes and without taxes
        if ($params['get_taxed_prices'] && AREA != 'A' && Registry::get('settings.Appearance.show_prices_taxed_clean') == 'Y' && $auth['tax_exempt'] != 'Y') {
            fn_get_taxed_and_clean_prices($product, $auth);
        }
        if ($params['get_features'] && !isset($product['product_features'])) {
            $product['product_features'] = fn_get_product_features_list($product, $params['features_display_on']);
        }
        if ($params['get_extra'] && !empty($product['is_edp']) && $product['is_edp'] == 'Y') {
            $product['agreement'] = array(fn_get_edp_agreements($product['product_id']));
        }
        $product['qty_content'] = fn_get_product_qty_content($product, $allow_negative_amount, $inventory_tracking);
        if ($params['detailed_params']) {
            $product['detailed_params'] = empty($product['detailed_params']) ? $params : array_merge($product['detailed_params'], $params);
        }
        /**
         * Add additional data to product
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_post', $product, $auth, $params);
        $_product = $product;
    }
    // \foreach $products
    /**
     * Add additional data to products after gathering additional products data
     *
     * @param array $product_ids Array of product identifiers
     * @param array $params      Parameteres for gathering data
     * @param array $products    Array of products
     * @param mixed $auth        Array of user authentication data
     */
    fn_set_hook('gather_additional_products_data_post', $product_ids, $params, $products, $auth);
    if ($params['get_for_one_product'] == true) {
        $products = array_shift($products);
    }
}
示例#13
0
                $combinationArrayItems = explode("_", $optionCombinationStart['combination']);
                $countedElements = count($combinationArrayItems);
                for ($i = 0; $i < $countedElements; $i++) {
                    if ($i % 2 == 0) {
                        $combination[$combinationArrayItems[$i]] = $combinationArrayItems[$i + 1];
                    }
                }
                //var_dump($optionCombinationStart['combination']);echo" ----- ";var_dump(array("product_id"=>$optionCombinationStart['product_id'],"combination_hash"=>$optionCombinationStart['combination_hash'],"combination"=>$combination));echo"<br/>";
                $optionCombinationsFinal[] = array("product_id" => $optionCombinationStart['product_id'], "combination_hash" => $optionCombinationStart['combination_hash'], "combination" => $combination, "old_price" => $optionCombinationStart['price']);
            }
        }
        foreach ($optionCombinationsFinal as $optionCombinationFinal) {
            $product = fn_get_product_data($optionCombinationFinal['product_id'], $_SESSION['auth'], CART_LANGUAGE, '', true, true, true, true, $auth['area'] == 'A' && !empty($_REQUEST['action']) && $_REQUEST['action'] == 'preview');
            $product['product_options'] = fn_get_product_options(array($optionCombinationFinal['product_id']), CART_LANGUAGE);
            $product = fn_apply_options_rules($product);
            $product['product_options'] = fn_get_selected_product_options($product['product_id'], $combination, CART_LANGUAGE);
            $product = fn_apply_options_rules($product);
            //var_dump($optionCombinationFinal['product_id']);echo" ==> ";var_dump($optionCombinationFinal['combination_hash']);echo" ==> ";var_dump($optionCombinationFinal['old_price']);echo" => ";var_dump(fn_calculate_price_of_a_product($product, $optionCombinationFinal['combination']));echo"<br/>";
            $newPrice = fn_calculate_price_of_a_product($product, $optionCombinationFinal['combination']);
            db_query("UPDATE ?:product_options_inventory_prices SET ?u WHERE product_id = ?i AND combination_hash=?s", array('price' => $newPrice), $optionCombinationFinal['product_id'], $optionCombinationFinal['combination_hash']);
        }
    }
    exit;
}
if ($mode == 'option_variant_link_product_save') {
    // delete the link allready in
    db_query('DELETE FROM ?:product_option_variants_link WHERE `option_variant_id`=?i AND `product_id` = ?i', $_REQUEST['option_variant_id'], intval($_REQUEST['product_id']));
    //insert the new link
    $_data = array('option_variant_id' => $_REQUEST['option_variant_id'], 'product_id' => $_REQUEST['product_id'], 'product_nr' => $_REQUEST['product_nr']);
    echo $inserted_id = db_query("INSERT INTO ?:product_option_variants_link ?e", $_data);
    exit;
示例#14
0
function fn_gather_additional_product_data(&$product, $get_icon = false, $get_detailed = false, $get_options = true, $get_discounts = true, $get_features = false)
{
    $auth =& $_SESSION['auth'];
    if ($get_icon == true || $get_detailed == true) {
        if (empty($product['main_pair'])) {
            $product['main_pair'] = fn_get_image_pairs($product['product_id'], 'product', 'M', $get_icon, $get_detailed, CART_LANGUAGE);
            if (Registry::get('settings.General.enable_thumbnail_new_stamp') == "Y") {
                $threshold = strtotime("-" . Registry::get('settings.General.new_stamp_time_threshold') . " days");
            } else {
                $threshold = time();
            }
            if (strtotime($product['timestamp']) > $threshold && $product['main_pair']['new'] == 0) {
                //new product - update thumbnails and check "new" flag
                $product['main_pair']['force'] = 'new';
                db_query('UPDATE ?:images_links SET new=1 WHERE pair_id=?i', $product['main_pair']['pair_id']);
            } elseif (strtotime($product['timestamp']) < $threshold && $product['main_pair']['new'] == 1) {
                //old product - update thumbnails and uncheck "new" flag
                $product['main_pair']['force'] = 'old';
                db_query('UPDATE ?:images_links SET new=0 WHERE pair_id=?i', $product['main_pair']['pair_id']);
            }
        }
    }
    if (!isset($product['base_price'])) {
        $product['base_price'] = $product['price'];
        // save base price (without discounts, etc...)
    }
    // Convert product categories
    if (!empty($product['category_ids']) && !is_array($product['category_ids'])) {
        $product['category_ids'] = fn_convert_categories($product['category_ids']);
    }
    $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options'];
    // Get product options
    if ($get_options == true) {
        if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
            $types = db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']);
            $product['options_type'] = $types['options_type'];
            $product['exceptions_type'] = $types['exceptions_type'];
        }
        if (empty($product['product_options'])) {
            if (!empty($product['combination'])) {
                $selected_options = fn_get_product_options_by_combination($product['combination']);
            }
            $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, CART_LANGUAGE) : fn_get_product_options($product['product_id'], CART_LANGUAGE);
        }
        $product = fn_apply_options_rules($product);
        if ($get_icon == true || $get_detailed == true) {
            // Get product options images
            if (!empty($product['combination_hash'])) {
                $image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'M', $get_icon, $get_detailed, CART_LANGUAGE);
                if (!empty($image)) {
                    $product['main_pair'] = $image;
                }
            }
        }
        $product['has_options'] = !empty($product['product_options']);
        $product = fn_apply_exceptions_rules($product);
    } else {
        $product['has_options'] = db_get_field("SELECT COUNT(*) FROM ?:product_options as a LEFT JOIN ?:product_global_option_links as c ON c.option_id = a.option_id WHERE (a.product_id = ?i OR c.product_id = ?i) AND a.status = 'A'", $product['product_id'], $product['product_id']);
    }
    fn_set_hook('get_additional_product_data_before_discounts', $product, $auth, $get_options);
    // Get product discounts
    if ($get_discounts == true && !isset($product['exclude_from_calculate'])) {
        fn_promotion_apply('catalog', $product, $auth);
        if (!empty($product['prices']) && is_array($product['prices'])) {
            $product_copy = $product;
            foreach ($product['prices'] as $pr_k => $pr_v) {
                $product_copy['base_price'] = $product_copy['price'] = $pr_v['price'];
                fn_promotion_apply('catalog', $product_copy, $auth);
                $product['prices'][$pr_k]['price'] = $product_copy['price'];
            }
        }
        if (empty($product['discount']) && !empty($product['list_price']) && !empty($product['price']) && floatval($product['price']) && $product['list_price'] > $product['price']) {
            $product['list_discount'] = fn_format_price($product['list_price'] - $product['price']);
            $product['list_discount_prc'] = sprintf('%d', round($product['list_discount'] * 100 / $product['list_price']));
        }
    }
    // FIXME: old product options scheme
    $product['discounts'] = array('A' => 0, 'P' => 0);
    if (!empty($product['promotions'])) {
        foreach ($product['promotions'] as $v) {
            foreach ($v['bonuses'] as $a) {
                if ($a['discount_bonus'] == 'to_fixed') {
                    $product['discounts']['A'] += $a['discount'];
                } elseif ($a['discount_bonus'] == 'by_fixed') {
                    $product['discounts']['A'] += $a['discount_value'];
                } elseif ($a['discount_bonus'] == 'to_percentage') {
                    $product['discounts']['P'] += 100 - $a['discount_value'];
                } elseif ($a['discount_bonus'] == 'by_percentage') {
                    $product['discounts']['P'] += $a['discount_value'];
                }
            }
        }
    }
    // Add product prices with taxes and without taxes
    if (!empty($product) && AREA != 'A' && Registry::get('settings.Appearance.show_prices_taxed_clean') == 'Y' && $auth['tax_exempt'] != 'Y') {
        fn_get_taxed_and_clean_prices($product, $auth);
    }
    if (!isset($product['product_features']) && $get_features == true) {
        $product['product_features'] = fn_get_product_features_list($product['product_id']);
    }
    if (!empty($product['is_edp']) && $product['is_edp'] == 'Y') {
        $product['agreement'] = array(fn_get_edp_agreements($product['product_id']));
    }
    $qty_content = array();
    if (!empty($product['qty_step'])) {
        $per_item = 0;
        if (Registry::get('settings.General.allow_negative_amount') == 'Y' && !empty($product['max_qty'])) {
            $amount = $product['max_qty'];
        } else {
            $amount = isset($product['in_stock']) ? $product['in_stock'] : (isset($product['inventory_amount']) ? $product['inventory_amount'] : $product['amount']);
        }
        for ($i = 1; $per_item <= $amount - $product['qty_step']; $i++) {
            $per_item = $product['qty_step'] * $i;
            if (!empty($product['list_qty_count']) && $i > $product['list_qty_count']) {
                break;
            }
            if (!empty($product['max_qty']) && $per_item > $product['max_qty'] || !empty($product['min_qty']) && $per_item < $product['min_qty']) {
                continue;
            }
            $qty_content[$i] = $per_item;
        }
    }
    $product['qty_content'] = $qty_content;
    $product['detailed_params'] = empty($product['detailed_params']) ? array() : $product['detailed_params'];
    $product['detailed_params'] = array_merge($product['detailed_params'], array('get_icon' => $get_icon, 'get_detailed' => $get_detailed, 'get_options' => $get_options, 'get_discounts' => $get_discounts, 'get_features' => $get_features));
    fn_set_hook('get_additional_product_data', $product, $auth, $get_options);
}