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; }
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; }
/** * 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; }