/** * Checks required products on recalculation * * @param array $cart Array of the cart contents and user information necessary for purchase * @param array $cart_products Cart products * @param array $auth Array of user authentication data (e.g. uid, usergroup_ids, etc.) * @return bool Always true */ function fn_check_calculated_required_products(&$cart, &$cart_products, $auth) { if (!empty($cart['products'])) { foreach ($cart['products'] as $key => $entry) { if (!empty($entry['product_id'])) { $ids = fn_get_required_products_ids($entry['product_id']); if (!empty($ids)) { $have = fn_required_products_get_existent($auth, $ids, $cart); if (empty($have) || count($have) != count($ids)) { if (empty($entry['extra']['parent'])) { $cart['amount'] -= $entry['amount']; } unset($cart['products'][$key]); unset($cart_products[$key]); if (isset($cart['product_groups'])) { foreach ($cart['product_groups'] as $key_group => $group) { if (in_array($key, array_keys($group['products']))) { unset($cart['product_groups'][$key_group]['products'][$key]); } } } fn_check_calculated_required_products($cart, $cart_products, $auth); } } } } } return true; }
/** * Checks product list and adds required products * * @param array $product_data Products data * @param mixed $auth Array with authorization data * @param array $cart * @param array $added_products Products that are checked for further products that need to be added * @return bool False if some products were removed, otherwise - true */ function fn_check_added_required_products(&$product_data, $auth, &$cart, $added_products = array()) { $result = true; foreach ($product_data as $key => $entry) { if (!empty($entry['amount']) && !empty($key)) { $product_id = !empty($entry['product_id']) ? $entry['product_id'] : $key; $added_products[$product_id] = $entry; $ids = fn_get_required_products_ids($product_id); if (!empty($ids)) { $have = fn_required_products_get_existent($auth, $ids); if (empty($have) || count($have) != count($ids)) { $products_to_cart = array_diff($ids, $have); $out_of_stock = array(); $check_products = array(); foreach ($products_to_cart as $id) { if (!empty($added_products[$id])) { continue; } $amount = fn_check_amount_in_stock($id, 1, fn_get_default_product_options($id), 0, 'N', 0, $cart); if (!$amount) { $out_of_stock[] = $id; } else { $check_products[$id] = array('product_id' => $id, 'amount' => $amount); } } if (empty($out_of_stock) && fn_check_added_required_products($check_products, $auth, $cart, $added_products)) { $cart['change_cart_products'] = true; $msg = __('required_products_added'); foreach ($check_products as $id => $v) { if (empty($added_products[$id])) { $added_products[$id] = $v; $product_data[$id] = $v; $msg .= "<br />" . fn_get_product_name($id); $cart['amount'] = !isset($cart['amount']) ? $v['amount'] : $cart['amount'] + $v['amount']; } } } else { unset($product_data[$key]); unset($added_products[$product_id]); $result = false; $msg = __('required_products_out_of_stock'); foreach ($out_of_stock as $id) { $msg .= "<br />" . fn_get_product_name($id); } } //fn_set_notification('N', __('notice'), $msg); } } } } return $result; }