Anonymous
Prestashop: сохраняет результаты поиска, возвращает отсутствующий результат
Сообщение
Anonymous » 15 окт 2024, 00:47
На странице магазинов мы можем искать магазины, указав город или адрес. Когда я проверил результаты, в них отсутствуют некоторые магазины.
Я попытался проверить файл store.js и обнаружил, что магазины возвращены с помощью ajax из контроллера Stores функция displayAjax вызывает функцию getStores.
Функция displaAjax
Код: Выделить всё
protected function displayAjax()
{
$stores = $this->getStores();
$parnode = new SimpleXMLElement('');
foreach ($stores as $store) {
$other = '';
$newnode = $parnode->addChild('marker');
$newnode->addAttribute('name', $store['name']);
$address = $this->processStoreAddress($store);
$other .= $this->renderStoreWorkingHours($store);
$newnode->addAttribute('addressNoHtml', strip_tags(str_replace('
', ' ', $address)));
$newnode->addAttribute('address', $address);
$newnode->addAttribute('other', $other);
$newnode->addAttribute('phone', $store['phone']);
$newnode->addAttribute('id_store', (int)$store['id_store']);
$newnode->addAttribute('has_store_picture', file_exists(_PS_STORE_IMG_DIR_.(int)$store['id_store'].'.jpg'));
$newnode->addAttribute('lat', (float)$store['latitude']);
$newnode->addAttribute('lng', (float)$store['longitude']);
if (isset($store['distance'])) {
$newnode->addAttribute('distance', (int)$store['distance']);
}
}
header('Content-type: text/xml');
die($parnode->asXML());
}
И функция getStores
Код: Выделить всё
public function getStores()
{
$distance_unit = Configuration::get('PS_DISTANCE_UNIT');
if (!in_array($distance_unit, array('km', 'mi'))) {
$distance_unit = 'km';
}
if (Tools::getValue('all') == 1) {
$stores = Db::getInstance()->executeS('
SELECT s.*, cl.name country, st.iso_code state
FROM '._DB_PREFIX_.'store s
'.Shop::addSqlAssociation('store', '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 = 1000;//(int)Tools::getValue('radius', 100);
$multiplicator = ($distance_unit == '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
'.Shop::addSqlAssociation('store', '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');
}
return $stores;
}
Я пытался увеличить радиус до 1000 км, но всегда получаю один и тот же результат.
Подробнее здесь:
https://stackoverflow.com/questions/401 ... ing-result
1728942467
Anonymous
На странице магазинов мы можем искать магазины, указав город или адрес. Когда я проверил результаты, в них отсутствуют некоторые магазины. Я попытался проверить файл store.js и обнаружил, что магазины возвращены с помощью ajax из контроллера Stores функция displayAjax вызывает функцию getStores. Функция displaAjax [code]protected function displayAjax() { $stores = $this->getStores(); $parnode = new SimpleXMLElement(''); foreach ($stores as $store) { $other = ''; $newnode = $parnode->addChild('marker'); $newnode->addAttribute('name', $store['name']); $address = $this->processStoreAddress($store); $other .= $this->renderStoreWorkingHours($store); $newnode->addAttribute('addressNoHtml', strip_tags(str_replace(' ', ' ', $address))); $newnode->addAttribute('address', $address); $newnode->addAttribute('other', $other); $newnode->addAttribute('phone', $store['phone']); $newnode->addAttribute('id_store', (int)$store['id_store']); $newnode->addAttribute('has_store_picture', file_exists(_PS_STORE_IMG_DIR_.(int)$store['id_store'].'.jpg')); $newnode->addAttribute('lat', (float)$store['latitude']); $newnode->addAttribute('lng', (float)$store['longitude']); if (isset($store['distance'])) { $newnode->addAttribute('distance', (int)$store['distance']); } } header('Content-type: text/xml'); die($parnode->asXML()); } [/code] И функция getStores [code] public function getStores() { $distance_unit = Configuration::get('PS_DISTANCE_UNIT'); if (!in_array($distance_unit, array('km', 'mi'))) { $distance_unit = 'km'; } if (Tools::getValue('all') == 1) { $stores = Db::getInstance()->executeS(' SELECT s.*, cl.name country, st.iso_code state FROM '._DB_PREFIX_.'store s '.Shop::addSqlAssociation('store', '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 = 1000;//(int)Tools::getValue('radius', 100); $multiplicator = ($distance_unit == '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 '.Shop::addSqlAssociation('store', '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'); } return $stores; } [/code] Я пытался увеличить радиус до 1000 км, но всегда получаю один и тот же результат. Подробнее здесь: [url]https://stackoverflow.com/questions/40157798/prestashop-stores-search-result-return-missing-result[/url]