/** * Compile SearchParameterBag * * @param SearchParameterBag $parameterBag * @return \HealthCareAbroad\SearchBundle\Services\CompiledSearchParameter */ public function compile(SearchParameterBag $parameterBag) { $urlGenerator = new SearchUrlGenerator(); $variables = $this->_extractVariables($parameterBag); $searchState = 0; // search form parameter to search url route key mapping $searchUrlParameterKeyMapping = SearchUrlGenerator::getSearchParameterKeyToSearchUrlKeyMapping(); // parameter key to search state value mapping $searchStateMapping = SearchStates::getSearchParameterKeyMappingToSearchStateValues(); // get the current state of the search based on current variables, prepare also the url parameters for url generator foreach ($variables as $key => $variableObj) { // add the state value for this key $searchState += $searchStateMapping[$key]; // map to the route key $searchUrlKey = \array_key_exists($key, $searchUrlParameterKeyMapping) ? $searchUrlParameterKeyMapping[$key] : $key; // TODO: this will fail if slug will not be used as a URL parameter value if (\method_exists($variableObj, 'getSlug')) { $urlGenerator->addParameter($searchUrlKey, $variableObj->getSlug()); } } // route to state mapping $routeToStateMapping = SearchStates::getStateToRouteMapping(); $routeName = $routeToStateMapping[SearchStates::getSearchStateFromValue($searchState)]; $url = $urlGenerator->generateByRouteName($routeName, false); // generate the url $compiledSearch = new CompiledSearchParameter($variables, $url, $searchState); return $compiledSearch; }
/** * Create a PageMetaConfiguration based on the current search objects * * @param array $searchObjects * @return \HealthCareAbroad\HelperBundle\Entity\PageMetaConfiguration */ public function buildFromSearchObjects(array $searchObjects = array()) { $searchState = 0; $searchStateMapping = SearchStates::getSearchUrlParameterKeyToSearchStateValueMapping(); $pageMetaVariables = array(); foreach ($searchObjects as $key => $_searchObject) { $searchState += $searchStateMapping[$key]; $pageMetaVariables[$key] = \is_object($_searchObject) ? $_searchObject->getName() : $_searchObject; } $searchStateValue = SearchStates::getSearchStateFromValue($searchState); $title = ''; $description = ''; $keywords = ''; switch ($searchStateValue) { // singe searches - destination case SearchStates::COUNTRY_SEARCH: case SearchStates::CITY_SEARCH: $destinationArr = $this->_extractDestinationValues($pageMetaVariables); $destination = \implode(', ', $destinationArr); $title = 'Healthcare and Dental Clinics in ' . $destination . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} clinics that offer medical specialties in ' . $destination . '. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = $destination . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; // single searches - specialization // single searches - specialization case SearchStates::SPECIALIZATION_SEARCH: $title = $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} clinics that offer ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ' in different countries. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; // single searches - Sub-specialization // single searches - Sub-specialization case SearchStates::SUB_SPECIALIZATION_SEARCH: $treatmentsArr = $this->_extractTreatmentValues($pageMetaVariables); $title = \implode(' - ', $treatmentsArr) . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} clinics that offer ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SUB_SPECIALIZATION] . ' in different countries. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = \implode(', ', $treatmentsArr) . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; // single searches - treatment // single searches - treatment case SearchStates::TREATMENT_SEARCH: $treatmentsArr = $this->_extractTreatmentValues($pageMetaVariables); $title = \implode(' - ', $treatmentsArr) . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_TREATMENT] . ' clinics in different countries. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = \implode(', ', $treatmentsArr) . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; // combination search - destination + specialization // combination search - destination + specialization case SearchStates::COUNTRY_SPECIALIZATION_SEARCH: case SearchStates::CITY_SPECIALIZATION_SEARCH: $destinationArr = $this->_extractDestinationValues($pageMetaVariables); $destination = \implode(', ', $destinationArr); $title = $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ' in ' . $destination . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} clinics that offer ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ' in ' . $destination . '. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = $destination . ', ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION] . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; case SearchStates::COUNTRY_SUB_SPECIALIZATION_SEARCH: case SearchStates::CITY_SUB_SPECIALIZATION_SEARCH: $destinationArr = $this->_extractDestinationValues($pageMetaVariables); $treatmentsArr = $this->_extractTreatmentValues($pageMetaVariables); $destination = \implode(', ', $destinationArr); $title = \implode(' - ', $treatmentsArr) . ' in ' . $destination . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} clinics that offer ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_SUB_SPECIALIZATION] . ' in ' . $destination . '. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = $destination . ', ' . \implode(', ', $treatmentsArr) . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; case SearchStates::COUNTRY_TREATMENT_SEARCH: case SearchStates::CITY_TREATMENT_SEARCH: $destinationArr = $this->_extractDestinationValues($pageMetaVariables); $treatmentsArr = $this->_extractTreatmentValues($pageMetaVariables); $destination = \implode(', ', $destinationArr); $title = \implode(' - ', $treatmentsArr) . ' in ' . $destination . ' - ' . $this->siteName; $description = 'Compare {' . PageMetaConfigurationService::CLINIC_RESULTS_COUNT_VARIABLE . '} ' . $pageMetaVariables[SearchUrlGenerator::SEARCH_URL_PARAMETER_TREATMENT] . ' clinics in ' . $destination . '. ' . $this->siteName . ' is an unbiased international directory of Healthcare and Dental Clinics'; $keywords = $destination . ', ' . \implode(', ', $treatmentsArr) . ', Medical tourism, compare, international, abroad, doctor, dr, dentist'; break; } $metaConfig = new PageMetaConfiguration(); $metaConfig->setTitle($title); $metaConfig->setDescription($description); $metaConfig->setKeywords($keywords); $metaConfig->setPageType(PageMetaConfiguration::PAGE_TYPE_SEARCH_RESULTS); return $metaConfig; }
/** * Mimic frontend search process and get results for ranking management * * @param Request $request * @return \Symfony\Component\HttpFoundation\Response * @author acgvelarde */ public function processSearchAction(Request $request) { $searchParameterService = $this->get('services.search.parameters'); $compiledSearch = $searchParameterService->compileRequest($request); $searchStateLabel = SearchStates::getSearchStateFromValue($compiledSearch->getSearchState()); $searchVariables = $compiledSearch->getVariables(); $searchService = $this->get('services.search'); // flag on what ranking point the search service is using $isUsingInstitutionRankingPoints = false; switch ($searchStateLabel) { // treatments only search case SearchStates::SPECIALIZATION_SEARCH: $specialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SPECIALIZATION_ID]; $results = $searchService->searchBySpecialization($specialization); $isUsingInstitutionRankingPoints = false; // uses clinic ranking points break; case SearchStates::SUB_SPECIALIZATION_SEARCH: $subSpecialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SUB_SPECIALIZATION_ID]; $results = $searchService->searchBySubSpecialization($subSpecialization); $isUsingInstitutionRankingPoints = false; // uses clinic ranking points break; case SearchStates::TREATMENT_SEARCH: $isUsingInstitutionRankingPoints = false; // uses clinic ranking points $treatment = $searchVariables[SearchParameterService::PARAMETER_KEY_TREATMENT_ID]; $results = $searchService->searchByTreatment($treatment); break; // destinations only search // destinations only search case SearchStates::COUNTRY_SEARCH: $isUsingInstitutionRankingPoints = true; // uses hospital ranking points $country = $searchVariables[SearchParameterService::PARAMETER_KEY_COUNTRY_ID]; $results = $searchService->searchByCountry($country); break; case SearchStates::CITY_SEARCH: $city = $searchVariables[SearchParameterService::PARAMETER_KEY_CITY_ID]; $results = $searchService->searchByCity($city); $isUsingInstitutionRankingPoints = true; // uses hospital ranking points break; // combination search // combination search case SearchStates::COUNTRY_SPECIALIZATION_SEARCH: $isUsingInstitutionRankingPoints = false; $specialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SPECIALIZATION_ID]; $country = $searchVariables[SearchParameterService::PARAMETER_KEY_COUNTRY_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($specialization, $country)); break; case SearchStates::COUNTRY_SUB_SPECIALIZATION_SEARCH: $isUsingInstitutionRankingPoints = false; $subSpecialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SUB_SPECIALIZATION_ID]; $country = $searchVariables[SearchParameterService::PARAMETER_KEY_COUNTRY_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($subSpecialization, $country)); break; case SearchStates::COUNTRY_TREATMENT_SEARCH: $isUsingInstitutionRankingPoints = false; $treatment = $searchVariables[SearchParameterService::PARAMETER_KEY_TREATMENT_ID]; $country = $searchVariables[SearchParameterService::PARAMETER_KEY_COUNTRY_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($treatment, $country)); break; case SearchStates::CITY_SPECIALIZATION_SEARCH: $isUsingInstitutionRankingPoints = false; $city = $searchVariables[SearchParameterService::PARAMETER_KEY_CITY_ID]; $specialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SPECIALIZATION_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($specialization, $city)); break; case SearchStates::CITY_SUB_SPECIALIZATION_SEARCH: $isUsingInstitutionRankingPoints = false; $subSpecialization = $searchVariables[SearchParameterService::PARAMETER_KEY_SUB_SPECIALIZATION_ID]; $city = $searchVariables[SearchParameterService::PARAMETER_KEY_CITY_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($subSpecialization, $city)); break; case SearchStates::CITY_TREATMENT_SEARCH: $isUsingInstitutionRankingPoints = false; $city = $searchVariables[SearchParameterService::PARAMETER_KEY_CITY_ID]; $treatment = $searchVariables[SearchParameterService::PARAMETER_KEY_TREATMENT_ID]; $results = $this->getDoctrine()->getManager()->getRepository('TermBundle:SearchTerm')->findByFilters(array($treatment, $city)); break; } //TODO: for now, we only need the first page for ranking purposes $pagerAdapter = new ArrayAdapter($results); $pager = new Pager($pagerAdapter, array('page' => 1, 'limit' => 20)); // we compose the response data $responseData = array('results' => array(), 'totalNumberOfResults' => \count($results), 'searchState' => $searchStateLabel); foreach ($pager->getResults() as $searchTerm) { if ($searchTerm instanceof SearchTerm) { $institution = $searchTerm->getInstitution(); $institutionMedicalCenter = $searchTerm->getInstitutionMedicalCenter(); $arr = array('institution' => array('id' => $institution->getId(), 'name' => $institution->getName(), 'totalClinicRankingPoints' => $institution->getTotalClinicRankingPoints() ? $institution->getTotalClinicRankingPoints() : 0), 'institutionMedicalCenter' => array('id' => $institutionMedicalCenter->getId(), 'name' => $institutionMedicalCenter->getName(), 'rankingPoints' => $institutionMedicalCenter->getRankingPoints() ? $institutionMedicalCenter->getRankingPoints() : 0)); $arr['isUsingInstitutionRankingPoints'] = $isUsingInstitutionRankingPoints; $arr['rankingPoints'] = $isUsingInstitutionRankingPoints ? $arr['institution']['totalClinicRankingPoints'] : $arr['institutionMedicalCenter']['rankingPoints']; $responseData['results'][] = $arr; } } return new Response(\json_encode($responseData), 200, array('content-type' => 'application/json')); }
{ return array(SearchStates::COUNTRY_SEARCH => SearchUrlRoutes::RESULTS_COUNTRY, SearchStates::CITY_SEARCH => SearchUrlRoutes::RESULTS_CITY, SearchStates::SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_SPECIALIZATION, SearchStates::SUB_SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_SUB_SPECIALIZATION, SearchStates::TREATMENT_SEARCH => SearchUrlRoutes::RESULTS_TREATMENT, SearchStates::COUNTRY_SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_COUNTRY_SPECIALIZATION, SearchStates::COUNTRY_SUB_SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_COUNTRY_SUB_SPECIALIZATION, SearchStates::COUNTRY_TREATMENT_SEARCH => SearchUrlRoutes::RESULTS_COUNTRY_TREATMENT, SearchStates::CITY_SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_CITY_SPECIALIZATION, SearchStates::CITY_SUB_SPECIALIZATION_SEARCH => SearchUrlRoutes::RESULTS_CITY_SUB_SPECIALIZATION, SearchStates::CITY_TREATMENT_SEARCH => SearchUrlRoutes::RESULTS_CITY_TREATMENT); } /** * Mapping of search parameter key to search state value. * This is useful in getting to total state value of the current request */ public static function getSearchParameterKeyMappingToSearchStateValues() { return array(SearchParameterService::PARAMETER_KEY_COUNTRY_ID => SearchStates::HAS_COUNTRY, SearchParameterService::PARAMETER_KEY_CITY_ID => SearchStates::HAS_CITY, SearchParameterService::PARAMETER_KEY_SPECIALIZATION_ID => SearchStates::HAS_SPECIALIZATION, SearchParameterService::PARAMETER_KEY_SUB_SPECIALIZATION_ID => SearchStates::HAS_SUB_SPECIALIZATION, SearchParameterService::PARAMETER_KEY_TREATMENT_ID => SearchStates::HAS_TREATMENT); } public static function getSearchUrlParameterKeyToSearchStateValueMapping() { return array(SearchUrlGenerator::SEARCH_URL_PARAMETER_COUNTRY => SearchStates::HAS_COUNTRY, SearchUrlGenerator::SEARCH_URL_PARAMETER_CITY => SearchStates::HAS_CITY, SearchUrlGenerator::SEARCH_URL_PARAMETER_SPECIALIZATION => SearchStates::HAS_SPECIALIZATION, SearchUrlGenerator::SEARCH_URL_PARAMETER_SUB_SPECIALIZATION => SearchStates::HAS_SUB_SPECIALIZATION, SearchUrlGenerator::SEARCH_URL_PARAMETER_TREATMENT => SearchStates::HAS_TREATMENT); } public static function getStateValue($state) { return isset(self::$searchStateValues[$state]) ? self::$searchStateValues[$state] : null; } public static function getSearchStateFromValue($value) { $byValue = \array_flip(self::$searchStateValues); return isset($byValue[$value]) ? $byValue[$value] : null; } public static function _initiateValue() { self::$searchStateValues = array(SearchStates::COUNTRY_SEARCH => SearchStates::HAS_COUNTRY, SearchStates::CITY_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_CITY, SearchStates::SPECIALIZATION_SEARCH => SearchStates::HAS_SPECIALIZATION, SearchStates::SUB_SPECIALIZATION_SEARCH => SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_SUB_SPECIALIZATION, SearchStates::TREATMENT_SEARCH => SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_TREATMENT, SearchStates::COUNTRY_SPECIALIZATION_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_SPECIALIZATION, SearchStates::COUNTRY_SUB_SPECIALIZATION_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_SUB_SPECIALIZATION, SearchStates::COUNTRY_TREATMENT_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_TREATMENT, SearchStates::CITY_SPECIALIZATION_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_CITY + SearchStates::HAS_SPECIALIZATION, SearchStates::CITY_SUB_SPECIALIZATION_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_CITY + SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_SUB_SPECIALIZATION, SearchStates::CITY_TREATMENT_SEARCH => SearchStates::HAS_COUNTRY + SearchStates::HAS_CITY + SearchStates::HAS_SPECIALIZATION + SearchStates::HAS_TREATMENT); } } SearchStates::_initiateValue();