function fn_str_htmlentities($s, $charset) { $_charset = strtolower($charset); if ($_charset == 'unicode') { $s = fn_unicode_to_utf8($s); $charset = 'UTF-8'; } if ($_charset == 'gb2312' || $_charset == '936') { $s = htmlentities($s, ENT_QUOTES, $charset); } else { $s = mb_convert_encoding($s, 'HTML-ENTITIES', $charset); } return $s; }
function fn_apply_options_rules($product) { /** * Changes product data before applying product options rules * * @param array $product Product data */ fn_set_hook('apply_options_rules_pre', $product); /* Options type: P - simultaneous/parallel S - sequential */ // Check for the options and exceptions types 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'])); } // Get the selected options or get the default options $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options']; $product['options_update'] = $product['options_type'] == 'S' ? true : false; // Conver the selected options text to the utf8 format if (!empty($product['product_options'])) { foreach ($product['product_options'] as $id => $option) { if (!empty($option['value'])) { $product['product_options'][$id]['value'] = fn_unicode_to_utf8($option['value']); } if (!empty($product['selected_options'][$option['option_id']])) { $product['selected_options'][$option['option_id']] = fn_unicode_to_utf8($product['selected_options'][$option['option_id']]); } } } $selected_options =& $product['selected_options']; $changed_option = empty($product['changed_option']) ? true : false; $simultaneous = array(); $next = 0; foreach ($product['product_options'] as $_id => $option) { if (!in_array($option['option_type'], array('I', 'T', 'F'))) { $simultaneous[$next] = $option['option_id']; $next = $option['option_id']; } if (!empty($option['value'])) { $selected_options[$option['option_id']] = $option['value']; } if (!$changed_option && $product['changed_option'] == $option['option_id']) { $changed_option = true; } if (!empty($selected_options[$option['option_id']]) && ($selected_options[$option['option_id']] == 'checked' || $selected_options[$option['option_id']] == 'unchecked') && $option['option_type'] == 'C') { foreach ($option['variants'] as $variant) { if ($variant['position'] == 0 && $selected_options[$option['option_id']] == 'unchecked' || $variant['position'] == 1 && $selected_options[$option['option_id']] == 'checked') { $selected_options[$option['option_id']] = $variant['variant_id']; if ($changed_option) { $product['changed_option'] = $option['option_id']; } } } } // Check, if the product has any options modifiers if (!empty($product['product_options'][$_id]['variants'])) { foreach ($product['product_options'][$_id]['variants'] as $variant) { if (!empty($variant['modifier']) && floatval($variant['modifier'])) { $product['options_update'] = true; } } } } if (!empty($product['changed_option']) && empty($selected_options[$product['changed_option']]) && $product['options_type'] == 'S') { $product['changed_option'] = array_search($product['changed_option'], $simultaneous); if ($product['changed_option'] == 0) { unset($product['changed_option']); $reset = true; if (!empty($selected_options)) { foreach ($selected_options as $option_id => $variant_id) { if (!isset($product['product_options'][$option_id]) || !in_array($product['product_options'][$option_id]['option_type'], array('I', 'T', 'F'))) { unset($selected_options[$option_id]); } } } } } if (empty($selected_options) && $product['options_type'] == 'P') { $selected_options = fn_get_default_product_options($product['product_id'], true, $product); } if (empty($product['changed_option']) && isset($reset)) { $product['changed_option'] = ''; } elseif (empty($product['changed_option'])) { end($selected_options); $product['changed_option'] = key($selected_options); } if ($product['options_type'] == 'S') { empty($product['changed_option']) ? $allow = 1 : ($allow = 0); foreach ($product['product_options'] as $_id => $option) { $product['product_options'][$_id]['disabled'] = false; if (in_array($option['option_type'], array('I', 'T', 'F'))) { continue; } $option_id = $option['option_id']; if ($allow >= 1) { unset($selected_options[$option_id]); $product['product_options'][$_id]['value'] = ''; } if ($allow >= 2) { $product['product_options'][$_id]['disabled'] = true; continue; } if (empty($product['changed_option']) || !empty($product['changed_option']) && $product['changed_option'] == $option_id || $allow > 0) { $allow++; } } $product['simultaneous'] = $simultaneous; } // echo "selected_options :";var_dump($selected_options); // Restore selected values if (!empty($selected_options)) { foreach ($product['product_options'] as $_id => $option) { if (isset($selected_options[$option['option_id']])) { $product['product_options'][$_id]['value'] = $selected_options[$option['option_id']]; } } } // Generate combination hash to get images. (Also, if the tracking with options, get amount and product code) $inventoryOptions = db_get_fields("SELECT a.option_id FROM ?:product_options as a LEFT JOIN ?:product_global_option_links as b ON a.option_id = b.option_id WHERE (a.product_id = ?i OR b.product_id = ?i) AND a.option_type IN ('S','R','C','Y') AND a.inventory = 'Y' ORDER BY position DESC", $product_id, $product_id); $defaultSelectedProductOptions = fn_get_default_product_options($product_id, true, $product); $selectedOptions = array(); foreach ($inventoryOptions as $inventoryOption) { if ($defaultSelectedProductOptions[$inventoryOption]) { $selectedOptions[$inventoryOption] = $defaultSelectedProductOptions[$inventoryOption]; } } $combination_hash = fn_generate_cart_id($product['product_id'], array('product_options' => $selected_options), true); // echo "<br>fn_generate_cart_id product page combination hash={$combination_hash} product options "; // var_dump($selected_options); // echo '<hr>'; // echo 'selected_options '.$selected_options; $product['combination_hash'] = $combination_hash; // Change product code and amount if (!empty($product['tracking']) && $product['tracking'] == 'O') { $product['hide_stock_info'] = false; if ($product['options_type'] == 'S') { foreach ($product['product_options'] as $option) { $option_id = $option['option_id']; if ($option['inventory'] == 'Y' && empty($product['selected_options'][$option_id])) { $product['hide_stock_info'] = true; break; } } } if (!$product['hide_stock_info']) { $combination = db_get_row("SELECT product_code, amount FROM ?:product_options_inventory WHERE combination_hash = ?i", $combination_hash); if (!empty($combination['product_code'])) { $product['product_code'] = $combination['product_code']; } if (Registry::get('settings.General.inventory_tracking') == 'Y') { if (isset($combination['amount'])) { $product['inventory_amount'] = $combination['amount']; // echo 'combination amount set: '; } else { $product['inventory_amount'] = $product['amount'] = 0; //echo 'combination amount not set :'.$product['inventory_amount']; } } } } if (!$product['options_update']) { $product['options_update'] = db_get_field('SELECT COUNT(*) FROM ?:product_options_inventory WHERE product_id = ?i', $product['product_id']); } /** * Changes product data after applying product options rules * * @param array $product Product data */ fn_set_hook('apply_options_rules_post', $product); return $product; }
function fn_apply_options_rules($product) { /* Options type: P - simultaneous/parallel S - sequential */ // Check for the options and exceptions types 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'])); } // Get the selected options or get the default options $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options']; $product['options_update'] = $product['options_type'] == 'S' ? true : false; // Conver the selected options text to the utf8 format if (!empty($product['product_options'])) { foreach ($product['product_options'] as $id => $option) { if (!empty($option['value'])) { $product['product_options'][$id]['value'] = fn_unicode_to_utf8($option['value']); } if (!empty($product['selected_options'][$option['option_id']])) { $product['selected_options'][$option['option_id']] = fn_unicode_to_utf8($product['selected_options'][$option['option_id']]); } } } $selected_options =& $product['selected_options']; $changed_option = empty($product['changed_option']) ? true : false; $simultaneous = array(); $next = 0; foreach ($product['product_options'] as $_id => $option) { $simultaneous[$next] = $option['option_id']; $next = $option['option_id']; if (!empty($option['value'])) { $selected_options[$option['option_id']] = $option['value']; } if (!$changed_option && $product['changed_option'] == $option['option_id']) { $changed_option = true; } if (!empty($selected_options[$option['option_id']]) && ($selected_options[$option['option_id']] == 'checked' || $selected_options[$option['option_id']] == 'unchecked') && $option['option_type'] == 'C') { foreach ($option['variants'] as $variant) { if ($variant['position'] == 0 && $selected_options[$option['option_id']] == 'unchecked' || $variant['position'] == 1 && $selected_options[$option['option_id']] == 'checked') { $selected_options[$option['option_id']] = $variant['variant_id']; if ($changed_option) { $product['changed_option'] = $option['option_id']; } } } } // Check, if the product has any options modifiers if (!empty($product['product_options'][$_id]['variants'])) { foreach ($product['product_options'][$_id]['variants'] as $variant) { if (!empty($variant['modifier']) && floatval($variant['modifier'])) { $product['options_update'] = true; } } } } if (!empty($product['changed_option']) && empty($selected_options[$product['changed_option']]) && $product['options_type'] == 'S') { $product['changed_option'] = array_search($product['changed_option'], $simultaneous); if ($product['changed_option'] == 0) { unset($product['changed_option']); if (!empty($selected_options)) { foreach ($selected_options as $option_id => $variant_id) { if (!in_array($option['option_type'], array('I', 'T', 'F'))) { unset($selected_options[$option_id]); } } } } } if (empty($selected_options) && $product['options_type'] == 'P') { $selected_options = fn_get_default_product_options($product['product_id'], true); } if (empty($product['changed_option'])) { end($selected_options); $product['changed_option'] = key($selected_options); } if ($product['options_type'] == 'S') { empty($product['changed_option']) ? $allow = 1 : ($allow = 0); foreach ($product['product_options'] as $_id => $option) { $product['product_options'][$_id]['disabled'] = false; if (in_array($option['option_type'], array('I', 'T', 'F'))) { continue; } $option_id = $option['option_id']; if ($allow >= 1) { unset($selected_options[$option_id]); $product['product_options'][$_id]['value'] = ''; } if ($allow >= 2) { $product['product_options'][$_id]['disabled'] = true; continue; } if (empty($product['changed_option']) || !empty($product['changed_option']) && $product['changed_option'] == $option_id || $allow > 0) { $allow++; } } $product['simultaneous'] = $simultaneous; } // Restore selected values if (!empty($selected_options)) { foreach ($product['product_options'] as $_id => $option) { if (isset($selected_options[$option['option_id']])) { $product['product_options'][$_id]['value'] = $selected_options[$option['option_id']]; } } } // Change price if (empty($product['modifiers_price'])) { $product['base_modifier'] = fn_apply_options_modifiers($selected_options, $product['base_price'], 'P'); $old_price = $product['price']; $product['price'] = $product['original_price'] = fn_apply_options_modifiers($selected_options, $product['price'], 'P'); $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'); } // Generate combination hash to get images. (Also, if the tracking with options, get amount and product code) $combination_hash = fn_generate_cart_id($product['product_id'], array('product_options' => $selected_options), true); $product['combination_hash'] = $combination_hash; // Change product code and amount if (!empty($product['tracking']) && $product['tracking'] == 'O') { $combination = db_get_row("SELECT product_code, amount FROM ?:product_options_inventory WHERE combination_hash = ?i", $combination_hash); if (!empty($combination['product_code'])) { $product['product_code'] = $combination['product_code']; } if (isset($combination['amount'])) { $product['inventory_amount'] = $combination['amount']; } else { $product['inventory_amount'] = $product['amount'] = 0; } } if (!$product['options_update']) { $product['options_update'] = db_get_field('SELECT COUNT(*) FROM ?:product_options_inventory WHERE product_id = ?i', $product['product_id']); } fn_set_hook('apply_options_rules', $product); return $product; }