Exemple #1
0
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;
}
Exemple #3
0
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;
}