public static function getAllZonesByAddress(UserAddress $address, $type = 0) { if (!$address->isLoaded()) { $address->load(); } $zones = array(); // get zones by state if ($address->state->get()) { $f = new ARSelectFilter(new EqualsCond(new ARFieldHandle('DeliveryZone', 'isEnabled'), true)); $f->mergeCondition(new EqualsCond(new ARFieldHandle('DeliveryZoneState', 'stateID'), $address->state->get()->getID())); $f->mergeCondition(new InCond(new ARFieldHandle('DeliveryZone', 'type'), array(DeliveryZone::BOTH_RATES, $type))); $s = ActiveRecordModel::getRecordSet('DeliveryZoneState', $f, ActiveRecordModel::LOAD_REFERENCES); foreach ($s as $zoneState) { $zones[] = $zoneState->deliveryZone->get(); } } // get zones by country if (!$zones) { $f = new ARSelectFilter(new EqualsCond(new ARFieldHandle('DeliveryZone', 'isEnabled'), true)); $f->mergeCondition(new EqualsCond(new ARFieldHandle('DeliveryZoneCountry', 'countryCode'), $address->countryID->get())); $f->mergeCondition(new InCond(new ARFieldHandle('DeliveryZone', 'type'), array(DeliveryZone::BOTH_RATES, $type))); $s = ActiveRecordModel::getRecordSet('DeliveryZoneCountry', $f, array('DeliveryZone')); foreach ($s as $zone) { $zones[] = $zone->deliveryZone->get(); } } $maskPoints = array(); // leave zones that match masks foreach ($zones as $key => $zone) { $match = $zone->getMaskMatch($address); if (!$match) { unset($zones[$key]); } else { $maskPoints[$key] = $match; } } if ($maskPoints) { arsort($maskPoints); // this should really be a one-liner, but not today $ret = array(); foreach (array_keys($maskPoints) as $key) { $ret[] = $zones[$key]; } return $ret; } return $zones; }