Блок выбора города на drupal-сайте (+ автоматически по ip)

На многих корпоративных сайтах вверху есть блок выбора своего города, и при его изменении на сайте уже отображаются статьи или какой-то материал, специфичный именно для этого места.

Примеры таких блоков: на сайте Альфа-банка или Эльдорадо, даже Сбербанк не отстаёт и перенаправляет пользователя сразу на нужный раздел сайта.

Итак, чтобы сделать такое на Друпале, нам понадобится:

Модуль Smart IP: https://drupal.org/project/smart_ip

Мой модуль интеграции русской базы ip-адресов с модулем Smart IP: (тут будет ссылка на скачивание)

Дальше есть выбор - делать всплывающую форму вручную или воспольноваться кучкой соответствующих модулей. Писать свой код всё равно придется, так что выбор не так очевиден, как кажется на первый взгляд.

Я пошел по пути использования модулей, поэтому здесь описан только этот вариант.

Связка Webform + modalform, а так же небольшое дополнение Webform Term Options

Устанавливаем всю эту радость, в настройках /admin/config/people/smart_ip выставляем использовать нашу локальную базу (в самом конце), импортируем свежие данные о диапазонах ip-адресов с сайта ipgeobase.ru,

создаем блок в шапку, куда пишем примерно такой код:
<?php print 'Ваш город: ' . '<a href="' . base_path() . 'modal_forms/nojs/webform/572"  class="ctools-use-modal ctools-modal-modal-popup-small choose_city" >' . $_SESSION['smart_ip']['location']['city'] . '</a>'; ?>

Вместо 572 надо будет потом подставить ид своей вебформы, когда мы её создадим.

Выводим его в шапку. Если всё настроено правильно, у нас сразу определится наш город по нашему же ip-адресу (если только это не локальная машина)

Дальше делаем всплывающую форму для выбора и изменения города.

Создаем вебформу, в неё ставим всего один параметр "Город", "Выпадающий список", далее, там выбираем "подставить предопределенные значения", выбираем словарь таксономии, в котором у нас хранятся все города. В поле "Сообщение о подтверждении" (в самом верху) пишем следующее:

Ваши настройки сохраняются...
<script>
//jQuery(".popups-close").click(); 
location.reload();
</script>

Собственно, всё. Сохраняем, изменяем в коде блока ид на текущий ид вебформы, кликаем на город, должна всплыть форма выбора города.

Еще нужно сделать кастомный модуль и туда засунуть примерно такой код:

 
function вашмодуль_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'webform_client_form_572') {
    if ($_SESSION['smart_ip']['location']) {
      $form['submitted']['gorod']['#default_value'] = 'tid_' . $_SESSION['smart_ip']['location']['zip'];
      $form['#submit'][] = '_webform_city_submit';
    }
  }
}

function _webform_city_submit($form, $form_state) {
  //тут сохраняем в сессию
  $tid = substr($form_state['values']['submitted_tree']['gorod'], 4); //because 'tid_X';
  if ($_SESSION['smart_ip']['zip'] != $tid) {
    //тут перезаписываем
    $_SESSION['smart_ip']['zip'] = $tid;
    $_SESSION['smart_ip']['city'] = db_select('taxonomy_term_data', 'terms')
          ->fields('terms', array('name'))
          ->condition('tid', $tid, '=')
          ->execute()->fetchField();
    global $user;
    $location = $_SESSION['smart_ip'];
    smart_ip_set_location_data($user, $location); 
  }
}

Готово. Теперь при изменении города в вебформе и сохранении, город так же будет изменяться и в сессии пользователя.

Осталось только настроить фильтрацию контента в зависимости от выбранного города.

Для этого заходим в любую вьюху, которую надо фильтровать в зависимости от города, там создаем контекстный фильтр по полю "Город", там ставим "если значения фильтра нет в url", выполнить php-код,

пишем:

if($_SESSION['smart_ip']['zip']) {
return $_SESSION['smart_ip']['zip'];
}
else return 1;

сохраняем. Вот и всё, теперь вьюха фильтруется в зависимости от города, который определяется автоматически по ip пользователя.

В дальнейшнейшем при желании можно настроить работу модуля Context в зависимости от выбранного города (показывать определенные блоки только определенным городам).

Удачи!

 

Утащила отсюда, так как планирую реализовывать. Возможно, будут комменты и дополнения.

Рекомендовать в Социальных сетях:
 

Комментариев 8 на “Блок выбора города на drupal-сайте (+ автоматически по ip)

  1. ни чего не получается для Drupal 7, если вы такие крутые то покажите на скриншонах как это у вас вышло…

    • Это копипаст с другого блога, даже есть ссылка. Я решила несколько иначе, но до статьи пока руки не дошли

  2. Здравствуйте!
    А Вы можете по подробней описать.

    Устанавливаем всю эту радость, в настройках /admin/config/people/smart_ip выставляем использовать нашу локальную базу (в самом конце), импортируем свежие данные о диапазонах ip-адресов с сайта ipgeobase.ru,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *