function cw_check_condition_A($offer_id, $and_logic = true) { global $cart, $tables; global $affected_product_ids, $_affected_product_ids; # Check all A conditions $conditions = cw_query("SELECT object_id, quantity, param1 as value, param2 as operation FROM {$tables['ps_cond_details']} WHERE offer_id='{$offer_id}' AND object_type='" . PS_OBJ_TYPE_ATTR . "'"); if (!empty($conditions) && is_array($conditions)) { $condition_attributes = array(); foreach ($conditions as $k => $c) { $a = cw_func_call('cw_attributes_get_attribute', array('attribute_id' => $c['object_id'])); $condition_attributes[$a['attribute_id']] = $a; } unset($a); $semicart = array(); // Join products in cart by productid and calculate total available amount taking into account affected ids if (is_array($cart['products'])) { foreach ($cart['products'] as $prod) { if (!isset($semicart[$prod['product_id']])) { $attributes = cw_func_call('cw_attributes_get', array('item_id' => $prod['product_id'], 'item_type' => 'P', 'attribute_fields' => array_column($condition_attributes, 'field'))); $semicart[$prod['product_id']] = array('product_id' => $prod['product_id'], 'amount' => -1 * $_affected_product_ids['ids'][$prod['product_id']], 'attributes' => $attributes); } $semicart[$prod['product_id']]['amount'] += $prod['amount']; } } // Clear unavailable products foreach ($semicart as $pid => $prod) { if ($prod['amount'] <= 0) { unset($semicart[$pid]); } } // Now semicart contains only available products and we consider it as cart # Check for all products in cart foreach ($conditions as $c) { if (in_array($condition_attributes[$c['object_id']]['type'], array('selectbox', 'multi-selectbox'))) { $condition_attribute_value = cw_attributes_get_value_by_attribute_value_id($c['value']); } else { $condition_attribute_value = $c['value']; } foreach ($semicart as $kk => $prod) { if (in_array($condition_attributes[$c['object_id']]['type'], array('selectbox', 'multi-selectbox'))) { $product_attribute_value = $prod['attributes'][$condition_attributes[$c['object_id']]['field']]['values_str'][0]; } else { $product_attribute_value = $prod['attributes'][$condition_attributes[$c['object_id']]['field']]['value']; } if (cw_call('cw_ps_compare_attributes', array($product_attribute_value, $condition_attribute_value, $c['operation']))) { $_affected_product_ids['ids'][$prod['product_id']] += min($prod['amount'], $c['quantity']); $c['quantity'] -= $prod['amount']; if ($c['quantity'] <= 0) { break; } // Ok, we reached condition quantity, no need to check other products } } if ($c['quantity'] > 0 && $and_logic) { return false; // one of the products is not in cart or has insufficient amount (AND logic) } elseif ($c['quantity'] <= 0 && !$and_logic) { return true; // at least one manufacturer found in cart with enough amount (OR logic) } } if (!$and_logic) { return false; } // Nothing found with (OR logic) } if (empty($conditions) && !$and_logic) { return false; } // this result should not affect whole formula if OR is used return true; # there are no A conditions at all OR all conditions are met }
function cw_attribute_get_value($attribute_id, $item_id, $language = null) { global $tables, $current_language, $cw_attributes; $language = $language ? $language : $current_language; $attribute = $cw_attributes['all'][$attribute_id]; $value = cw_query_first_cell("SELECT value FROM {$tables['attributes_values']} WHERE item_id='{$item_id}' AND attribute_id='{$attribute_id}' AND code IN ('{$language}','')"); if (in_array($attribute['type'], array('selectbox', 'multi-selectbox'))) { // replace reference to value ID by real value return cw_attributes_get_value_by_attribute_value_id($value); } return $value; }