diff --git a/controllers/front/StoresController.php b/controllers/front/StoresController.php index 32e18513d..7a21a1ee3 100644 --- a/controllers/front/StoresController.php +++ b/controllers/front/StoresController.php @@ -29,6 +29,10 @@ class StoresControllerCore extends FrontController { public $php_self = 'stores'; + /** + * Initialize stores controller + * @see FrontController::init() + */ public function init() { parent::init(); @@ -38,13 +42,81 @@ class StoresControllerCore extends FrontController $this->errors[] = Tools::displayError('Dom extension is not loaded.'); $smarty->assign('errors', $this->errors); } + } - $simplifiedStoreLocator = Configuration::get('PS_STORES_SIMPLIFIED'); + /** + * get formatted string address + */ + private function processStoreAddress($store) + { + $ignore_field = array( + 'firstname', + 'lastname' + ); + + $out = ''; + $out_datas = array(); + + $address_datas = AddressFormat::getOrderedAddressFields($store['id_country'], false, true); + $state = (isset($store['id_state'])) ? new State($store['id_state']) : null; + + foreach ($address_datas as $data_line) + { + $data_fields = explode(' ', $data_line); + $addr_out = array(); + + $data_fields_mod = false; + foreach ($data_fields as $field_item) + { + $field_item = trim($field_item); + if (!in_array($field_item, $ignore_field) && !empty($store[$field_item])) + { + $addr_out[] = ($field_item == 'city' && $state && isset($state->iso_code) && strlen($state->iso_code)) ? + $store[$field_item].', '.$state->iso_code : $store[$field_item]; + $data_fields_mod = true; + } + } + if ($data_fields_mod) + $out_datas[] = implode(' ', $addr_out); + } + + $out = implode('
', $out_datas); + return $out; + } + + /** + * Assign template vars for simplified stores + */ + private function assignStoresSimplified() + { + $stores = Db::getInstance()->ExecuteS(' + SELECT s.*, cl.name country, st.iso_code state + FROM '._DB_PREFIX_.'store s + '.$this->context->shop->sqlAsso('shop', 's').' + LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) + LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) + WHERE s.active = 1 AND cl.id_lang = '.(int)$this->context->language->id); + + foreach ($stores as &$store) + $store['has_picture'] = file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg'); + + + $this->context->smarty->assign(array( + 'simplifiedStoresDiplay' => true, + 'stores' => $stores + )); + } + + /** + * Assign template vars for classical stores + */ + private function assignStores() + { $distanceUnit = Configuration::get('PS_DISTANCE_UNIT'); if (!in_array($distanceUnit, array('km', 'mi'))) $distanceUnit = 'km'; - - if ($simplifiedStoreLocator) + + if (Tools::getValue('all') == 1) { $stores = Db::getInstance()->ExecuteS(' SELECT s.*, cl.name country, st.iso_code state @@ -53,149 +125,125 @@ class StoresControllerCore extends FrontController LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) WHERE s.active = 1 AND cl.id_lang = '.(int)$this->context->language->id); - - foreach ($stores AS &$store) - $store['has_picture'] = file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg'); } else { - if (Tools::getValue('all') == 1) - { - $stores = Db::getInstance()->ExecuteS(' - SELECT s.*, cl.name country, st.iso_code state - FROM '._DB_PREFIX_.'store s - '.$this->context->shop->sqlAsso('shop', 's').' - LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) - LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) - WHERE s.active = 1 AND cl.id_lang = '.(int)$this->context->language->id); - } - else - { - $distance = (int)(Tools::getValue('radius', 100)); - $multiplicator = ($distanceUnit == 'km' ? 6371 : 3959); + $distance = (int)(Tools::getValue('radius', 100)); + $multiplicator = ($distanceUnit == 'km' ? 6371 : 3959); - $stores = Db::getInstance()->ExecuteS(' - SELECT s.*, cl.name country, st.iso_code state, - ('.(int)($multiplicator).' * acos(cos(radians('.(float)(Tools::getValue('latitude')).')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.(float)(Tools::getValue('longitude')).')) + sin(radians('.(float)(Tools::getValue('latitude')).')) * sin(radians(latitude)))) distance, cl.id_country id_country - FROM '._DB_PREFIX_.'store s - '.$this->context->shop->sqlAsso('shop', 's').' - LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) - LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) - WHERE s.active = 1 AND cl.id_lang = '.(int)$this->context->language->id.' - HAVING distance < '.(int)($distance).' - ORDER BY distance ASC - LIMIT 0,20'); - } - - if (Tools::getValue('ajax') == 1) - { - $dom = new DOMDocument('1.0'); - $node = $dom->createElement('markers'); - $parnode = $dom->appendChild($node); - - $days[1] = 'Monday'; - $days[2] = 'Tuesday'; - $days[3] = 'Wednesday'; - $days[4] = 'Thursday'; - $days[5] = 'Friday'; - $days[6] = 'Saturday'; - $days[7] = 'Sunday'; - - foreach ($stores AS $store) - { - $days_datas = array(); - $node = $dom->createElement('marker'); - $newnode = $parnode->appendChild($node); - $newnode->setAttribute('name', $store['name']); - $address = $this->_processStoreAddress($store); - - $other = ''; - if (!empty($store['hours'])) - { - $hours = unserialize($store['hours']); - - for ($i = 1; $i < 8; $i++) - { - $hours_datas = array(); - $hours_datas['day'] = $days[$i]; - $hours_datas['hours'] = $hours[(int)($i) - 1]; - $days_datas[] = $hours_datas; - } - $this->context->smarty->assign('days_datas', $days_datas); - $this->context->smarty->assign('id_country', $store['id_country']); - - $other .= $this->context->smarty->fetch(_PS_THEME_DIR_.'store_infos.tpl'); - } - - $newnode->setAttribute('addressNoHtml', strip_tags(str_replace('
', ' ', $address))); - $newnode->setAttribute('address', $address); - $newnode->setAttribute('other', $other); - $newnode->setAttribute('phone', $store['phone']); - $newnode->setAttribute('id_store', (int)($store['id_store'])); - $newnode->setAttribute('has_store_picture', file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg')); - $newnode->setAttribute('lat', (float)($store['latitude'])); - $newnode->setAttribute('lng', (float)($store['longitude'])); - - if (isset($store['distance'])) - $newnode->setAttribute('distance', (int)($store['distance'])); - } - - header('Content-type: text/xml'); - die($dom->saveXML()); - } - else - $this->context->smarty->assign('hasStoreIcon', file_exists(dirname(__FILE__).'/../img/logo_stores.gif')); + $stores = Db::getInstance()->ExecuteS(' + SELECT s.*, cl.name country, st.iso_code state, + ('.(int)($multiplicator).' + * acos( + cos(radians('.(float)(Tools::getValue('latitude')).')) + * cos(radians(latitude)) + * cos(radians(longitude) - radians('.(float)(Tools::getValue('longitude')).')) + + sin(radians('.(float)(Tools::getValue('latitude')).')) + * sin(radians(latitude)) + ) + ) distance, + cl.id_country id_country + FROM '._DB_PREFIX_.'store s + '.$this->context->shop->sqlAsso('shop', 's').' + LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = s.id_country) + LEFT JOIN '._DB_PREFIX_.'state st ON (st.id_state = s.id_state) + WHERE s.active = 1 AND cl.id_lang = '.(int)$this->context->language->id.' + HAVING distance < '.(int)($distance).' + ORDER BY distance ASC + LIMIT 0,20'); } - $this->context->smarty->assign(array('distance_unit' => $distanceUnit, 'simplifiedStoresDiplay' => $simplifiedStoreLocator, 'stores' => $stores, 'mediumSize' => Image::getSize('medium'))); - } + if ($this->ajax) + $this->displayXmlMaps($stores); + else + $this->context->smarty->assign('hasStoreIcon', file_exists(dirname(__FILE__).'/../img/logo_stores.gif')); + - private function _processStoreAddress($store) + $this->context->smarty->assign(array( + 'distance_unit' => $distanceUnit, + 'simplifiedStoresDiplay' => false, + 'stores' => $stores + )); + } + + /** + * Display the Xml for showing the nodes in the google map + */ + private function displayXmlMaps($stores) { - $ignore_field = array( - 'firstname' =>1 - , 'lastname' =>1 - ); - - $out = ''; - $out_datas = array(); - - $address_datas = AddressFormat::getOrderedAddressFields($store['id_country'], false, true); - $state = (isset($store['id_state'])) ? new State($store['id_state']) : NULL; - - foreach ($address_datas as $data_line) + $dom = new DOMDocument('1.0'); + $node = $dom->createElement('markers'); + $parnode = $dom->appendChild($node); + + $days[1] = 'Monday'; + $days[2] = 'Tuesday'; + $days[3] = 'Wednesday'; + $days[4] = 'Thursday'; + $days[5] = 'Friday'; + $days[6] = 'Saturday'; + $days[7] = 'Sunday'; + + foreach ($stores as $store) { - $data_fields = explode(' ', $data_line); - $adr_out = array(); - - $data_fields_mod = false; - foreach ($data_fields as $field_item) + $days_datas = array(); + $node = $dom->createElement('marker'); + $newnode = $parnode->appendChild($node); + $newnode->setAttribute('name', $store['name']); + $address = $this->processStoreAddress($store); + + $other = ''; + if (!empty($store['hours'])) { - $field_item = trim($field_item); - if (!isset($ignore_field[$field_item]) && !empty($store[$field_item]) && $store[$field_item] != '') + $hours = unserialize($store['hours']); + + for ($i = 1; $i < 8; $i++) { - $adr_out[] = ($field_item == "city" && $state && isset($state->iso_code) && strlen($state->iso_code)) ? - $store[$field_item].', '.$state->iso_code : $store[$field_item]; - $data_fields_mod = true; + $hours_datas = array(); + $hours_datas['day'] = $days[$i]; + $hours_datas['hours'] = $hours[(int)($i) - 1]; + $days_datas[] = $hours_datas; } + $this->context->smarty->assign('days_datas', $days_datas); + $this->context->smarty->assign('id_country', $store['id_country']); + + $other .= $this->context->smarty->fetch(_PS_THEME_DIR_.'store_infos.tpl'); } - if ($data_fields_mod) - $out_datas[] = implode(' ', $adr_out); + + $newnode->setAttribute('addressNoHtml', strip_tags(str_replace('
', ' ', $address))); + $newnode->setAttribute('address', $address); + $newnode->setAttribute('other', $other); + $newnode->setAttribute('phone', $store['phone']); + $newnode->setAttribute('id_store', (int)($store['id_store'])); + $newnode->setAttribute('has_store_picture', file_exists(_PS_STORE_IMG_DIR_.(int)($store['id_store']).'.jpg')); + $newnode->setAttribute('lat', (float)($store['latitude'])); + $newnode->setAttribute('lng', (float)($store['longitude'])); + + if (isset($store['distance'])) + $newnode->setAttribute('distance', (int)($store['distance'])); } - - $out = implode('
', $out_datas); - return $out; + + header('Content-type: text/xml'); + die($dom->saveXML()); } - - + + /** + * Assign template vars related to page content + * @see FrontController::process() + */ public function process() { + if (Configuration::get('PS_STORES_SIMPLIFIED')) + $stores = $this->assignStoresSimplified(); + else + $stores = $this->assignStores(); + $this->context->smarty->assign(array( + 'mediumSize' => Image::getSize('medium'), 'defaultLat' => (float)Configuration::get('PS_STORES_CENTER_LAT'), 'defaultLong' => (float)Configuration::get('PS_STORES_CENTER_LONG'), 'searchUrl' => $this->context->link->getPageLink('stores') )); - + $this->setTemplate(_PS_THEME_DIR_.'stores.tpl'); }