PowerPartners.ru

Форум партнерской программы
Текущее время: 12 мар 2026, 23:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 17 фев 2026, 12:11 
Не в сети

Зарегистрирован: 02 июн 2020, 00:39
Сообщения: 213
Как можно вывести город клиента в любое другое место на сайте (например в хедер). При этом чтобы оставалась возможность выбора этого города?
То есть фактически нужен дубль этого блока из product.tmpl (с другими id, кончено же):
Код:
        <div class="city">
          <div>Ваш город:</div>
          <div>
            <i class="powericon-spinner powericon-pulse" id="city-spinner"></i>
            <a href="#" class="dotted" id="city"></a>
            <div class="autocomplete" style="display: none;">
              <input id="city_input" type="search" spellcheck="false" placeholder="Город">
            </div>
          </div>
        </div>


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 20 фев 2026, 17:28 
Не в сети
Поддержка партнеров
Аватара пользователя

Зарегистрирован: 13 май 2024, 13:47
Сообщения: 186
К этому коду надо добавить js, который будет получать город посетителя и отображать его в input id="city_input"

Как это делается можно посмотреть в product.js. Строки 22-63. Там основная логика получения города собрана в InteractiveDeliveryMap и возвращается в его событии onPickupCity.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 22 фев 2026, 08:44 
Не в сети

Зарегистрирован: 02 июн 2020, 00:39
Сообщения: 213
gadget писал(а):
К этому коду надо добавить js, который будет получать город посетителя и отображать его в input id="city_input"

Как это делается можно посмотреть в product.js. Строки 22-63. Там основная логика получения города собрана в InteractiveDeliveryMap и возвращается в его событии onPickupCity.


Там почему-то JS-код работает исключительно только со страницей товара, а на других страницах не срабатывает.
К примеру убираем со страницы продукта блок
Код:
        <div class="city">
          <div>Ваш город:</div>
          <div>
            <i class="powericon-spinner powericon-pulse" id="city-spinner"></i>
            <a href="#" class="dotted" id="city"></a>
            <div class="autocomplete" style="display: none;">
              <input id="city_input" type="search" spellcheck="false" placeholder="Город">
            </div>
          </div>
        </div>
и вставляем его в _header.tmpl. Подключаем все скрипты (product.js, api-maps.yandex.ru, idm.js и т.д.).
Заходим на любую страницу каталога и видим, что вместо названия города крутится спиннер. Но если далее перейти на страницу товара, то город будет определятся. При этом если снова перейти на любую страницу каталога, то город также отображается (кешируется, видимо, после страницы товаров).
Так как на странице каталога вместо города крутится спиннер, то есть строка кода <i class="powericon-spinner powericon-pulse" id="city-spinner"></i>, то получается, что функция
Код:
function displayCity(city) {
  $('#city-spinner').hide();
  $('#city').text(city)
  if ($('.autocomplete').css("display") == "none")
    $('#city').css('display', 'inline');
}
не срабатывает (строка 140 в product.js).
Но ведь срабатывать она должна по условию
Код:
if (city)
  displayCity(city);

Получается, что
Код:
var city = getCookie('idm_city');
также не срабатывает, в var данные на других страницах, кроме страниц товаров, не передаются.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 22 фев 2026, 17:51 
Не в сети
Поддержка партнеров
Аватара пользователя

Зарегистрирован: 13 май 2024, 13:47
Сообщения: 186
Ок, давайте подробнее. Прежде всего понадобится вот такой html:
Код:
<div class="city">
  <div>Ваш город:</div>
  <div>
    <i class="powericon-spinner powericon-pulse" id="city-spinner"></i>
    <a href="#" class="dotted" id="city"></a>
    <div class="autocomplete" style="display: none;">
      <input id="city_input" type="search" spellcheck="false" placeholder="Город">
    </div>
  </div>
</div>


Затем нужно подключить необходимые файлы:
Код:
<!-- Я.Карты -->
<script src="//api-maps.yandex.ru/2.1/?apikey=xxxx-xxxx-xxxx-xxxx&lang=ru_RU" type="text/javascript"></script>
<!-- Библиотека yadc.js -->
<script src="//cdn.yadc-js.ru/yadc.js" type="text/javascript" charset="utf-8"></script>
<!-- Библиотека InteractiveDeliveryMap -->
<script src="/theme/js/idm.js" type="text/javascript"></script>
<!-- Разные функции, в том числе для работы с cookies -->
<script src="/theme/js/utils.js" type="text/javascript"></script>
<!-- Выпадающий список с функцией автодополнения для выбора города -->
<script src="/theme/js/lib/autocomplete/autocomplete.js" type="text/javascript"></script>
<link href="/theme/js/lib/autocomplete/autocomplete.css" rel="stylesheet" media="all" />


Теперь пишем js, который всем этим будет управлять:
Код:
<script type="text/javascript">
  // При клике на название города - открываем выпадающий список с автодополнением
  $('#city').on('click', onCityClick);

  // Пробуем взять название города из cookie. Там мы его сохраняем как в кэше, что бы постоянно его не определять заново
  var city = getCookie('idm_city');

  // Дожидаемся готовности Я.Карт
  ymaps.ready(function(){
    // Создаем InteractiveDeliveryMap, передав ему обработчики событий
    window.idm = new InteractiveDeliveryMap({
      onPickupCitiesList: onPickupCitiesList,
      onCalcDeliveryAddressFound: onCalcDeliveryAddressFound,
      onPickupCity: onPickupCity,
    });
    // Запрашиваем полный список городов с пунктами выдачи
    window.idm.getPickupCitiesList();

    if (city)
      // Если город сохранен в cookie - просто отображаем его
      displayCity(city)
    else
      // Если нет - начинаем расчет стоимости доставки, попутно определяя координаты пользователя
      window.idm.calcDelivery();
  });


  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается, когда получен полный список городов с пунктами выдачи
  function onPickupCitiesList(cities) {
    // Создаем выпадающий список с городами и устанавливаем обработчики событий на потерю фокуса и выбор города
    autocomplete(document.getElementById("city_input"), cities, {
      onBlur: onCitiesListBlur,
      onSelect: onCitySelect,
    });
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается, когда найдены GPS координаты пользователя
  function onCalcDeliveryAddressFound(addr, coord) {
    // Запускаем поиск ближайшего к пользователю города, где есть пункт выдачи
    window.idm.getPickupCityByCoord(coord, {});
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается, когда найден ближайший к пользователю город, где есть ПВЗ
  function onPickupCity(data) {
    // Отображаем город
    displayCity(data.city);
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается при клике на название города
  function onCityClick(e) {
    // Предотвращаем переход по ссылке
    e.preventDefault();
    // Прячем ссылку на которой кликнули
    $(e.target).hide(0);
    // Вместо нее показываем выпадающий список и устанавливаем на него фокус
    $('.autocomplete').show();
    $('.autocomplete input').focus();
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается при выборе города в выпадающем списке
  function onCitySelect(city) {
    // Отображаем название выбранного города в ссылке
    $('#city').text(city);
    // Прячем выпадающий список
    $('#pickup').hide();
    // Сохраняем выбранный город в cookie, чтобы на других страницах повторно не определять
    setCookie('idm_city', city, false);
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Вызывается, когда выпадающий список городов теряет фокус
  function onCitiesListBlur() {
    // Прячем выпадающий список
    $('.autocomplete').hide();
    // Отображаем ссылку с названием города
    $('#city').show();
  }

  ///////////////////////////////////////////////////////////////////////////////////////
  // Отображаем город
  function displayCity(city) {
    // Прячем спинер
    $('#city-spinner').hide();
    // Отображаем название города
    $('#city').text(city);
    // Сохраняем его в cookie, чтобы на других страницах повторно не определять
    setCookie('idm_city', city, false);
    // Устанавливаем название города в placeholder-е выпадающего списка
    document.getElementById("city_input").setAttribute("placeholder", city);
    // Выставляем CSS display: inline для списка
    if ($('.autocomplete').css("display") == "none")
      $('#city').css('display', 'inline');
  }

</script>


Расписала все в комментариях. Более подробно описать уже, наверное, не смогу


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 24 фев 2026, 05:55 
Не в сети

Зарегистрирован: 02 июн 2020, 00:39
Сообщения: 213
Да, большое спасибо, всё отлично работает.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB