Application->GetADODBConnection(); $cached_var_name = 'ShippingQuotes'.crc32(serialize($params)); $day_ago = adodb_mktime() - 3600*24; $sql = 'SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "'.$cached_var_name.'" AND Cached > '.$day_ago; if($shipping_types = $db->GetOne($sql)) { return unserialize($shipping_types); } $sql = 'SELECT Classname FROM '.$this->Application->getUnitOption('sqe', 'TableName').' WHERE Status = 1'; $classes = $db->GetCol($sql); $classes[] = 'CustomShippingQuoteEngine'; // always persists $shipping_types = Array(); foreach($classes as $class) { $object =& $this->Application->recallObject($class); $new_shipping_types = $object->GetShippingQuotes($params); $shipping_types = array_merge($shipping_types, $new_shipping_types); } uasort($shipping_types, Array(&$this, 'price_sort')); //exclude not available shipping quotes by products $limit_types = unserialize($params['limit_types']); if (is_array($limit_types) && !in_array('ANY', $limit_types)) { if (count($limit_types) == 0) break; $available_types = array(); foreach ($shipping_types as $a_type) { $include = false; //exclude by default foreach ($limit_types as $limit) { $include = $include || preg_match("/^$limit/", $a_type['ShippingId']); if ($include) break; } if (!$include) continue; $available_types[$a_type['ShippingId']] = $a_type; } $shipping_types = $available_types; } //exclude Selected Products Only shipping types, not matching products $available_types = array(); foreach ($shipping_types as $a_type) { if (getArrayValue($a_type, 'SelectedOnly')) { if (!is_array($limit_types) || !in_array($a_type['ShippingId'], $limit_types)) continue; } $available_types[$a_type['ShippingId']] = $a_type; } $shipping_types = $available_types; $sql = 'DELETE FROM '.TABLE_PREFIX.'Cache WHERE VarName LIKE "ShippingQuotes%" AND Cached < '.$day_ago; $db->Query($sql); $sql = 'INSERT INTO '.TABLE_PREFIX.'Cache(VarName, Data, Cached) VALUES("'.$cached_var_name.'", '.$db->qstr(serialize($shipping_types)).', '.adodb_mktime().')'; $db->Query($sql); return $shipping_types; } function GetAvailableShippingTypes() { $db =& $this->Application->GetADODBConnection(); $sql = 'SELECT Classname FROM '.$this->Application->getUnitOption('sqe', 'TableName').' WHERE Status = 1'; $classes = $db->GetCol($sql); $classes[] = 'CustomShippingQuoteEngine'; // always persists $shipping_types = Array(); foreach($classes as $class) { $object =& $this->Application->recallObject($class); $new_shipping_types = $object->GetAvailableTypes(); $shipping_types = array_merge($shipping_types, $new_shipping_types); } uasort($shipping_types, Array(&$this, 'SortShippingTypes')); return $shipping_types; } function SortShippingTypes($elem1, $elem2) { if($elem1['_Name'] < $elem2['_Name']) { return -1; } elseif($elem1['_Name'] > $elem2['_Name']) { return 1; } else { return 0; } } function price_sort($elem1, $elem2) { if($elem1['TotalCost'] < $elem2['TotalCost']) { return -1; } elseif($elem1['TotalCost'] > $elem2['TotalCost']) { return 1; } else { return 0; } } }