/** * @param string $source * @param City $destination * @return mixed */ public function map($source, $destination) { $destination->setName($source); $translations = array('fr' => $source); if (!$destination->getName()) { $translations = array('en' => $source); } $this->translateProperty($destination, 'name', $translations); if ($destination->getLatitude() == null || $destination->getLongitude() == null) { $tabCoord = $this->google->getGoogleXmlCoords($source, 'fr'); if (isset($tabCoord[0]) && !empty($tabCoord[0]) && isset($tabCoord[1]) && !empty($tabCoord[1])) { $destination->setLatitude($tabCoord[0]); $destination->setLongitude($tabCoord[1]); } } return $destination; }
/** * @param $codeAdherent */ public function import($codeAdherent) { set_time_limit(0); $detailsClient = $this->getArtsysClient(); $xmlMapper = $this->getXmlMapper(); $em = $this->em; /** @var TranslationRepository $translationRepository */ $translationRepository = $em->getRepository('Gedmo\\Translatable\\Entity\\Translation'); $artsysInfos = $detailsClient->get('flux/hotel?codeAdherent=' . $codeAdherent, false); $serializer = SerializerBuilder::create()->build(); $hotel = $serializer->deserialize($artsysInfos, 'Seh\\Bundle\\ArtsysBundle\\Model\\Hotel', 'xml'); $artsysHotelXml = simplexml_load_string($artsysInfos); if ($artsysHotelXml) { $artsysHotel = $xmlMapper->map($artsysHotelXml); if ($artsysHotel != null && $artsysHotel instanceof Hotel) { foreach ($artsysHotel->getTransports() as $transport) { $em->remove($transport); } $transportsXml = $artsysHotelXml->xpath('transports/transport'); $labels = array('fr' => 'labelFR', 'en' => 'labelEN', 'de' => 'labelDE', 'es' => 'labelES', 'it' => 'labelIT', 'nl' => 'labelNL'); /** @var \SimpleXMLElement $transportXml */ foreach ($transportsXml as $transportXml) { /** @var \SimpleXMLElement $transportCategoryXml */ $transportCategoryXml = $transportXml->xpath('categorie')[0]; $transportCategoryId = $transportCategoryXml->xpath('@id'); $transportCategoryId = (string) $transportCategoryId[0]; if (!($transportCategory = $em->getRepository('SehBundle:HotelTransportCategory')->findOneBy(array('artsysId' => $transportCategoryId)))) { $transportCategory = new HotelTransportCategory(); $transportCategory->setArtsysId($transportCategoryId); foreach ($labels as $locale => $label) { $translationRepository->translate($transportCategory, 'label', $locale, (string) $transportCategoryXml->xpath($label)[0]); } } $transport = new HotelTransport(); if ($distance = $transportXml->xpath('distance')) { $transport->setDistance((string) $distance[0]); } if ($comments = $transportXml->xpath('commentaires')) { $transport->setComments((string) $comments[0]); } if ($label = $transportXml->xpath('libelle')) { $transport->setLabel((string) $label[0]); } $transport->setPublish($transportXml->xpath('publiable')[0] == 'true'); $transport->setCategory($transportCategory); $transport->setHotel($artsysHotel); $transportCategory->addTransport($transport); $artsysHotel->addTransport($transport); $em->persist($transportCategory); $em->persist($transport); $em->flush(); } $hotelPois = array(); /** @var HotelPoi $poi */ foreach ($artsysHotel->getHotelPois() as $poi) { if (in_array($poi->getPoi()->getArtsysID(), $hotelPois)) { $em->remove($poi); } else { $hotelPois[] = $poi->getPoi()->getArtsysID(); } } $poisXml = $artsysHotelXml->xpath('pois/poi'); /** @var \SimpleXMLElement $poiXml */ foreach ($poisXml as $poiXml) { /** @var \SimpleXMLElement $poiCategoryXml */ $poiCategoryXml = $poiXml->xpath('categoriePOI')[0]; $poiCategoryId = $poiCategoryXml->xpath('@id'); $poiCategoryId = (string) $poiCategoryId[0]; if (!($poiCategory = $em->getRepository('SehBundle:PoiCategory')->findOneBy(array('artsysID' => $poiCategoryId)))) { $poiCategory = new PoiCategory(); $poiCategory->setArtsysID($poiCategoryId); foreach ($labels as $locale => $label) { $translationRepository->translate($poiCategory, 'name', $locale, (string) $poiCategoryXml->xpath($label)[0]); } } $poiId = $poiXml->xpath('id'); $poiId = (string) $poiId[0]; /** @var Poi $poi */ if (!($poi = $em->getRepository('SehBundle:Poi')->findOneBy(array('artsysID' => $poiId)))) { $poi = new Poi(); $poi->setArtsysID($poiId); $poi->setName((string) $poiXml->xpath('precisions')[0]); } if (!($hotelPoi = $em->getRepository('SehBundle:HotelPoi')->findOneBy(array('hotel' => $artsysHotel, 'poi' => $poi)))) { $hotelPoi = new HotelPoi(); if ($distance = $poiXml->xpath('distance')) { $hotelPoi->setDistance((string) $distance[0]); } } $poi->setPoiCategory($poiCategory); $hotelPoi->setHotel($artsysHotel); $hotelPoi->setPoi($poi); $artsysHotel->addHotelPoi($hotelPoi); $em->persist($poiCategory); $em->persist($poi); $em->persist($hotelPoi); $em->flush(); } $city = $artsysHotel->getCity(); if ($city instanceof City) { if ($city->getLatitude() == null || $city->getLongitude() == null) { $tabCoord = $this->google->getGoogleXmlCoords($city->getName(), 'fr'); if (isset($tabCoord[0]) && !empty($tabCoord[0]) && isset($tabCoord[1]) && !empty($tabCoord[1])) { $city->setLatitude($tabCoord[0]); $city->setLongitude($tabCoord[1]); $em->persist($city); } } unset($city); } $cities = $artsysHotel->getLinkedCities(); foreach ($cities as $city) { if ($city instanceof City) { if ($city->getLatitude() == null || $city->getLongitude() == null) { $tabCoord = $this->google->getGoogleXmlCoords($city->getName(), 'fr'); if (isset($tabCoord[0]) && !empty($tabCoord[0]) && isset($tabCoord[1]) && !empty($tabCoord[1])) { $city->setLatitude($tabCoord[0]); $city->setLongitude($tabCoord[1]); $em->persist($city); } } unset($city); } } $em->flush(); $em->clear(); $artsysHotel = null; $artsysHotelXml = null; unset($artsysHotel); unset($artsysHotelXml); } } }