Exemple #1
0
/**
 * Validate rule
 *
 * @param int $promotion_id promotion ID
 * @param array $promotion rule data
 * @param array $data data array
 * @param array $auth auth array (for cart rules)
 * @param array $cart_products cart products array (for cart rules)
 * @return bool true if rule can be applied, false - otherwise
 */
function fn_promotion_validate($promotion_id, $promotion, &$data, &$auth, &$cart_products)
{
    $schema = fn_promotion_get_schema('conditions');
    $stop_validating = false;
    $result = true;
    static $parent_orders = array();
    fn_set_hook('pre_promotion_validate', $promotion_id, $promotion, $data, $stop_validating, $result, $auth, $cart_products);
    if ($stop_validating) {
        return $result;
    }
    if (empty($promotion['condition'])) {
        // if promotion is unconditional, apply it
        return true;
    }
    $promotion['value'] = !isset($promotion['value']) ? '' : $promotion['value'];
    if (!empty($schema[$promotion['condition']])) {
        $value = '';
        $parent_order_value = '';
        if (!empty($data['parent_order_id']) && empty($parent_orders[$data['parent_order_id']])) {
            $parent_orders[$data['parent_order_id']] = array('cart' => array(), 'cart_products' => array(), 'product_groups' => array());
            fn_form_cart($data['parent_order_id'], $parent_orders[$data['parent_order_id']]['cart'], $auth);
            list($parent_orders[$data['parent_order_id']]['cart_products'], $parent_orders[$data['parent_order_id']]['product_groups']) = fn_calculate_cart_content($parent_orders[$data['parent_order_id']]['cart'], $auth);
        }
        // Ordinary field
        if (!empty($schema[$promotion['condition']]['field'])) {
            // Array definition, parse it
            if (strpos($schema[$promotion['condition']]['field'], '@') === 0) {
                $value = fn_promotion_get_object_value($schema[$promotion['condition']]['field'], $data, $auth, $cart_products);
            } else {
                // If field can be used in both zones, it means that we're using products
                if (in_array('catalog', $schema[$promotion['condition']]['zones']) && in_array('cart', $schema[$promotion['condition']]['zones']) && !empty($cart_products)) {
                    // this is the "cart" zone. FIXME!!!
                    foreach ($cart_products as $v) {
                        if ($promotion['operator'] == 'nin') {
                            if (fn_promotion_validate_attribute($v[$schema[$promotion['condition']]['field']], $promotion['value'], 'in')) {
                                return false;
                            }
                        } else {
                            if (fn_promotion_validate_attribute($v[$schema[$promotion['condition']]['field']], $promotion['value'], $promotion['operator'])) {
                                return true;
                            }
                        }
                    }
                    return $promotion['operator'] == 'nin' ? true : false;
                }
                if (!isset($data[$schema[$promotion['condition']]['field']])) {
                    return false;
                }
                $value = $data[$schema[$promotion['condition']]['field']];
                if (!empty($data['parent_order_id']) && !empty($parent_orders[$data['parent_order_id']]['cart'][$schema[$promotion['condition']]['field']])) {
                    $parent_order_value = $parent_orders[$data['parent_order_id']]['cart'][$schema[$promotion['condition']]['field']];
                }
            }
            // Field is the result of function
        } elseif (!empty($schema[$promotion['condition']]['field_function'])) {
            $function_args = $schema[$promotion['condition']]['field_function'];
            $function_name = array_shift($function_args);
            $function_args_definitions = $function_args;
            // If field can be used in both zones, it means that we're using products
            if (in_array('catalog', $schema[$promotion['condition']]['zones']) && in_array('cart', $schema[$promotion['condition']]['zones']) && !empty($cart_products)) {
                // this is the "cart" zone. FIXME!!!
                foreach ($cart_products as $product) {
                    $function_args = $function_args_definitions;
                    foreach ($function_args as $k => $v) {
                        if (strpos($v, '@') !== false) {
                            $function_args[$k] =& fn_promotion_get_object_value($v, $product, $auth, $cart_products);
                        } elseif ($v == '#this') {
                            $function_args[$k] =& $promotion;
                        } elseif ($v == '#id') {
                            $function_args[$k] =& $promotion_id;
                        }
                    }
                    $value = call_user_func_array($function_name, $function_args);
                    if ($promotion['operator'] == 'nin') {
                        if (fn_promotion_validate_attribute($value, $promotion['value'], 'in')) {
                            return false;
                        }
                    } else {
                        if (fn_promotion_validate_attribute($value, $promotion['value'], $promotion['operator'])) {
                            return true;
                        }
                    }
                }
                return $promotion['operator'] == 'nin' ? true : false;
            }
            foreach ($function_args as $k => $v) {
                if (strpos($v, '@') !== false) {
                    $function_args[$k] =& fn_promotion_get_object_value($v, $data, $auth, $cart_products);
                } elseif ($v == '#this') {
                    $function_args[$k] =& $promotion;
                } elseif ($v == '#id') {
                    $function_args[$k] =& $promotion_id;
                }
            }
            $value = call_user_func_array($function_name, $function_args);
            if (!empty($data['parent_order_id']) && !empty($parent_orders[$data['parent_order_id']])) {
                $parent_p = $function_args_definitions;
                foreach ($parent_p as $k => $v) {
                    if (strpos($v, '@') !== false) {
                        $parent_p[$k] =& fn_promotion_get_object_value($v, $parent_orders[$data['parent_order_id']]['cart'], $auth, $parent_orders[$data['parent_order_id']]['cart_products']);
                    } elseif ($v == '#this') {
                        $parent_p[$k] =& $promotion;
                    } elseif ($v == '#id') {
                        $parent_p[$k] =& $promotion_id;
                    }
                }
                $parent_order_value = call_user_func_array($function_name, $parent_p);
            }
        }
        // Value is validated
        $result = fn_promotion_validate_attribute($value, $promotion['value'], $promotion['operator']);
        if ($parent_order_value) {
            $result = $result || fn_promotion_validate_attribute($parent_order_value, $promotion['value'], $promotion['operator']);
        }
        return $result;
    }
    return false;
}
/**
 * Validate rule
 *
 * @param int $promotion_id promotion ID
 * @param array $promotion rule data
 * @param array $data data array
 * @param array $auth auth array (for cart rules)
 * @param array $cart_products cart products array (for cart rules)
 * @return bool true if rule can be applied, false - otherwise
 */
function fn_promotion_validate($promotion_id, $promotion, &$data, &$auth, &$cart_products)
{
    $schema = fn_promotion_get_schema('conditions');
    if (empty($promotion['condition'])) {
        // if promotion is unconditional, apply it
        return true;
    }
    $promotion['value'] = !isset($promotion['value']) ? '' : $promotion['value'];
    if (!empty($schema[$promotion['condition']])) {
        $value = '';
        // Ordinary field
        if (!empty($schema[$promotion['condition']]['field'])) {
            // Array definition, parse it
            if (strpos($schema[$promotion['condition']]['field'], '@') === 0) {
                $value = fn_promotion_get_object_value($schema[$promotion['condition']]['field'], $data, $auth, $cart_products);
            } else {
                // If field can be used in both zones, it means that we're using products
                if (in_array('catalog', $schema[$promotion['condition']]['zones']) && in_array('cart', $schema[$promotion['condition']]['zones']) && !empty($cart_products)) {
                    // this is the "cart" zone. FIXME!!!
                    foreach ($cart_products as $v) {
                        if (fn_promotion_validate_attribute($v[$schema[$promotion['condition']]['field']], $promotion['value'], $promotion['operator']) == true) {
                            return true;
                        }
                    }
                    return false;
                }
                if (!isset($data[$schema[$promotion['condition']]['field']])) {
                    return false;
                }
                $value = $data[$schema[$promotion['condition']]['field']];
            }
            // Field is the result of function
        } elseif (!empty($schema[$promotion['condition']]['field_function'])) {
            $p = $schema[$promotion['condition']]['field_function'];
            $func = array_shift($p);
            $p_orig = $p;
            // If field can be used in both zones, it means that we're using products
            if (in_array('catalog', $schema[$promotion['condition']]['zones']) && in_array('cart', $schema[$promotion['condition']]['zones']) && !empty($cart_products)) {
                // this is the "cart" zone. FIXME!!!
                foreach ($cart_products as $product) {
                    $p = $p_orig;
                    foreach ($p as $k => $v) {
                        if (strpos($v, '@') !== false) {
                            $p[$k] =& fn_promotion_get_object_value($v, $product, $auth, $cart_products);
                        } elseif ($v == '#this') {
                            $p[$k] =& $promotion;
                        } elseif ($v == '#id') {
                            $p[$k] =& $promotion_id;
                        }
                    }
                    $value = call_user_func_array($func, $p);
                    if (fn_promotion_validate_attribute($value, $promotion['value'], $promotion['operator'])) {
                        return true;
                    }
                }
                return false;
            }
            foreach ($p as $k => $v) {
                if (strpos($v, '@') !== false) {
                    $p[$k] =& fn_promotion_get_object_value($v, $data, $auth, $cart_products);
                } elseif ($v == '#this') {
                    $p[$k] =& $promotion;
                } elseif ($v == '#id') {
                    $p[$k] =& $promotion_id;
                }
            }
            $value = call_user_func_array($func, $p);
        }
        // Value is validated
        return fn_promotion_validate_attribute($value, $promotion['value'], $promotion['operator']);
    }
    return false;
}