Пример #1
0
function fn_get_options_combinations_extra($product_id)
{
    $combinations = array();
    // Take first option
    $options_key = array_keys($options);
    $variant_number = reset($options_key);
    $option_id = $options[$variant_number];
    // Remove current option
    unset($options[$variant_number]);
    // Get combinations for other options
    $sub_combinations = !empty($options) ? fn_get_options_combinations($options, $variants) : array();
    if (!empty($variants[$variant_number])) {
        // run through variants
        foreach ($variants[$variant_number] as $variant) {
            if (!empty($sub_combinations)) {
                // add current variant to each subcombination
                foreach ($sub_combinations as $sub_combination) {
                    $sub_combination[$option_id] = $variant;
                    $combinations[] = $sub_combination;
                }
            } else {
                $combinations[] = array($option_id => $variant);
            }
        }
    } else {
        $combinations = $sub_combinations;
    }
    return $combinations;
}
Пример #2
0
 protected function generateCombinations($product)
 {
     $combinations = array();
     if (!empty($product['product_options'])) {
         $options = $product['product_options'];
         $variants = array();
         $variant_ids = array_keys($options);
         foreach ($variant_ids as $key => $option_id) {
             $variants[$key] = array_keys($options[$option_id]['variants']);
         }
         $combinations_ids = fn_get_options_combinations($variant_ids, $variants);
         $combinations = array();
         foreach ($combinations_ids as $key => $combination) {
             $combinations[$key] = array('product_id' => $product['product_id'], 'product_code' => $product['product_code'], 'combination_hash' => fn_generate_cart_id($product['product_id'], array('product_options' => $combination)), 'combination' => $combination, 'amount' => $product['amount'], 'temp' => 'Y', 'position' => 0, 'image_pairs' => reset($product['images']));
         }
     }
     return $combinations;
 }
Пример #3
0
/**
 * Generates product variants combinations
 *
 * @param int $product_id Product identifier
 * @param int $amount Default combination amount
 * @param array $options Array of option identifiers
 * @param array $variants Array of option variant identifier arrays in the order according to the $options parameter
 * @return array Array of combinations
 */
function fn_look_through_variants($product_id, $amount, $options, $variants)
{
    /**
     * Changes params for getting product variants combinations
     *
     * @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
     * @param array $string     Array of combinations values
     * @param int   $cycle      Options and variants key
     */
    fn_set_hook('look_through_variants_pre', $product_id, $amount, $options, $variants);
    $position = 0;
    $hashes = array();
    $combinations = fn_get_options_combinations($options, $variants);
    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);
                $_data['position'] = $position++;
                $old_data = db_get_row("SELECT combination_hash, amount, product_code " . "FROM ?:product_options_inventory " . "WHERE product_id = ?i AND combination_hash = ?i AND temp = 'Y'", $product_id, $_data['combination_hash']);
                $_data['amount'] = isset($old_data['amount']) ? $old_data['amount'] : $amount;
                $_data['product_code'] = isset($old_data['product_code']) ? $old_data['product_code'] : '';
                /**
                 * 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
                 */
                fn_set_hook('look_through_variants_update_combination', $combination, $_data, $product_id, $amount, $options, $variants);
                db_query("REPLACE INTO ?:product_options_inventory ?e", $_data);
                $combinations[] = $combination;
            }
            echo str_repeat('. ', count($combination));
        }
    }
    /**
     * Changes the product options combinations
     *
     * @param array $combination Array of combinations
     * @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
     */
    fn_set_hook('look_through_variants_post', $combinations, $product_id, $amount, $options, $variants);
    return $combinations;
}