[cityFields] Определение города по домену

Новая версия компонента cityFields приносит самый ожидаемый функционал — определение города по домену. И в данной статье я опишу процесс настройки этой возможности.

Начнём с того, что создадим свой список городов на странице компонента, если вы этого ещё не сделали. Ключ — это наш будущий поддомен для города.

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

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

Если вы изменяли стандартный код чанка cfCities.row, JS-файла или обновлялись до новой версии, необходимо добавить ссылки для переключения города. Стандартный код чанка cfCities.row теперь выглядит так:
<option value="[[+id]]" id="[[+key]]"[[+link:notempty=` data-href="[[+link]]"`]][[+selected]]>[[+name]]</option>
[[+link]] содержит ссылку на текущую страницу с учётом города.

Теперь проверьте вашу работу. Если у вас возникли какие-либо вопросы или проблемы, пишите тикеты в поддержку на modstore.pro, а также можете оставлять комментарии к данной записи. Как работает переключение городов на деле можно увидеть на демо сайте.

И стоит отдельно отметить и другие изменения у компонента:
  • Сниппет cfField можно использовать как модицифатор
    {'key' | cffield} или {'key' | cffield : 'msk'}
  • В плейсхолдеры записывается информация о текущем городе и записывается независимо от того, включена ли опция записи плейсхолдеров или нет.
    [[+cf.current_city]] - наименование текущего города;
    [[+cf.current_city.id]] - ID текущего города;
    [[+cf.current_city.key]] - ключ текущего города;
    [[+cf.current_city.url]] - ссылка на сайт с учётом текущего города.
  • Добавлены фильтры для данных в админке
  • Добавлен combobox со списком плейсхолдеров при добавлении/редактировании данных;
  • Добавлена проверка на дубли данных (уникальная связка плейсхолдер-значение) и городов (уникальный ключ и уникальное наименование);
  • Поправлены стили на странице редактировании товара miniShop2 2.4;
  • Поправлена связь с компонентом msOptionsPrice2;
  • Обновлена база данных городов sxGeo.
Компонент, как всегда, можно купить и скачать в нашем любимом магазине компонентов modstore.pro.
Сергей Фещуков
06 марта 2017, 05:53
modx.pro
3
8 196
+5
Поблагодарить автора Отправить деньги

Комментарии: 47

Rus
Rus
06 марта 2017, 10:21
0
Очень волнуют эти вопросы:
1. Возможна ли реализация городов в подкатегориях (site.ru/moskva/...)
2. Нужно ли создавать контексты для каждого города (если да, то добавление нового ресурса создается автоматически)?
    Сергей Фещуков
    06 марта 2017, 10:27
    0
    1. На текущий момент реализованы только города в поддоменах. В подкатегориях будет добавлено в ближайших версиях после того, как будут исправлены баги с реализацией городов в поддоменах, если они появятся. Так как города в подкатегориях будут основываться на этом же механизме.
    2. Прелесть этого компонента в том, что нет необходимости создавать под каждый город контексты. Если вам необходимо внутри содержимого ресурса использовать разные фрагменты текста для разных городов, необходимо использовать данные и выводить их с помощью сниппета/модификатора cfField или плейсхолдером (если опция включена).
      Rus
      Rus
      06 марта 2017, 10:34
      0
      1. Возможно ли за доплату в индивидуальном порядке реализовать этот функционал?

      2. Отлично, что не нужно создавать контексты. В этой связи возникают еще пару вопросов:
      а) подставляются ли переменные в метаданных (title, description);
      б) как создается карта сайта? Будут ли в сайтмапе ссылки на все страницы каждого города? Хотя, этот вопрос больше относится к городам в подкатегории.
        Сергей Фещуков
        06 марта 2017, 10:41
        0
        1. Этот функционал всё равно будет добавляться в компонент, так что только для вас его не получится добавить. За плату можно только простимулировать меня быстрее заняться этим вопросом. :)

        2а. Автоматически не подставляется. Как у вас реализован вывод title и description?
        2б. Карта сайта будет создаваться со ссылками по умолчанию, без учёта городов. Стандартная настройка site_url не подменяется.
          Rus
          Rus
          06 марта 2017, 11:05
          0
          тайтлы пока еще никак не реализованы. Узнал о существовании MODX неделю назад. Но мне нужно, чтобы переменные подставлялись и в метаданные. Также важна карта сайта.

          Большое спасибо за быстрые ответы. К сожалению, с данным функционалом ваш компонент не смогу применить.
        Андрей Шевяков
        27 августа 2018, 16:59
        0
        Добрый день!
        Реализован на данный момент функционал выбора города в подкатегориях (site.ru/moskva/...)?
          Сергей Фещуков
          28 августа 2018, 06:25
          0
          На данный момент, к сожалению, такой функционал ещё не реализован
      Максим
      17 марта 2017, 15:08
      0
      Добрый день у меня на сайте уже созданы контексты, данное дополнение с ними работать будет?
      2. Можно ли реализовать какой то сброс всех тв полей для каждого контекста?
      К примеру у каждого города есть метро и районы если у менеджера в ТВ Автодополении будет районы всех городов то это крайне не удобно.
      Так же на сайте реализованы теги, которые подобраны для определенного города и они высвечиваются во всех контекстах. Думаю суть проблемы понятна.
        Сергей Фещуков
        18 марта 2017, 10:35
        0
        Добрый день.
        1. Компонент не работает с контекстами. Оно создано специально для того, чтобы не создавать контексты для разных городов. Дописать этот функционал возможно, в принципе, или переписать под ваши нужды его.
        2. Придётся переписать тип ТВ или создать новый, чтобы поддерживал компонент. В общем, без правки такой функции не будет, но вообще реализовать можно.
        3. Опять же вопрос к автодополнениям, поддержку городов придётся дописывать.
          АндрейЧ
          18 марта 2017, 14:41
          0
          Сергей, пожалуйста когда-нибудь дайте возможность, в настройках города — отметить точку(и) на яндекс карте.
        АндрейЧ
        18 марта 2017, 14:54
        0
        Сергей, я просто вывел ваш снипет, добавил пару городов в настройках, поддомены добавил.

        И все, — города переключаются, но почему URL не меняется.
        Всегда Site.ru а не msk.site.ru или spb.site.ru

        Что я забыл?
          Сергей Фещуков
          18 марта 2017, 16:14
          0
          А в настройках компонента включили определение города по домену?
            АндрейЧ
            20 марта 2017, 18:59
            0
            Зря не посмотрел системные настройки / CityFields… Спасибо., четкий компонент.
              АндрейЧ
              20 марта 2017, 21:59
              0
              1. Проблема. У меня url генерируется без точки, т.е. Gorodsite.ru вместо Gorod.site.ru
              Так происходит только с одним городом, поддомен которого был выключен и CityFields эту ссылку как то запомнил хитро. Никак не могу избавиться.

              Пробывал удалять и ставить заново, но ссылка генерируется все равно — «Gorodsite.ru»
              А нормальные, включенный с самого начала поддомен, открывается как положено, с точкой.

              2. Просьба расширить функционал в новой версии CityFields

              Опцией в настройках при выборе которой, если город не определился — то открываеся site.ru
              а жители городов например Москва, попадали в соотв. поддомены типа moskva.site.ru

              И еще хочется опцию в настройках, с которой при заходе на site.ru, сайт спрашивает:
              Ваш город: Пермь? Далее посетитель нажимает «Пермь» — и срабатывает редирект perm.site.ru
                Сергей Фещуков
                21 марта 2017, 13:04
                0
                1. Попробуйте заново скачать компонент из магазина и переустановить его. Такой косяк был, но я его поправил.
                2. Хорошо, я реализую такой функционал в ближайшем обновлении.
                  АндрейЧ
                  21 марта 2017, 20:56
                  0
                  Спасибо, помогло. Это хостинг у меня какие-то папки создал…

                  Благодарю, буду очень ждать обновление.

                  Вопрос. CityFields сам географию по айпишнику определяет, и редиректит с site.ru на gorod.site.ru Верно?

                  Просто авто-редирект перестал работать после того как я решал прошлую проблему…
                  «Город в домене» в системных настройках включено.
                  Деинсталировать, Удалять, заново ставить попробывал.
                  С хостинга может быть удалить какую-нить папку?

                  ps После полного удаления в настройках «Управление городами и данными» поля заполнять не требуется, т.е. заполненные города остаются.
                    Дмитрий Маликов
                    27 апреля 2017, 19:35
                    0
                    Сергей, как успехи с функционалом?
                    joxi.ru/bmoJPxRUVQb0ry
                    joxi.ru/v29GMLRi1LbvrG
              Николай
              22 марта 2017, 23:10
              +1
              здравствуйте, а можно ли использовать компонент в системных настройках minishop2 для указания email менеджеров, что при отправки с разных городов письма отправлялись на разные ящики?
                Сергей Фещуков
                23 марта 2017, 13:51
                0
                Добрый день. К сожалению, такого не реализовано. Первый раз сталкиваюсь с такой необходимостью. Надо будет подумать как это грамотно реализовать.
                  Николай
                  24 марта 2017, 08:09
                  0
                  может можно в системную переменную как то передать значение?
                    Николай
                    27 марта 2017, 21:25
                    0
                    проблема остается актуальной… может появились идеи реализации?
                      Alexander
                      19 апреля 2017, 13:54
                      0
                      Если сайт на поддоменах и отправка форм через formit, то можно использовать такое решение:
                      1)создаете ящики так что бы были точные совпадение с именем поддомена, например msk@site.ru для сайта msk.site.ru.
                      2)создаете снипет print
                      <?php
                      if (preg_match('/([^\.]+)\.[^\.]+\.[^\.]+$/',$_SERVER['HTTP_HOST'], $match)) {
                      echo $match[1].$pre;
                      }
                      else {
                      echo '';
                      }
                      3)в снипите отправки пишем: [[!FormIt@custom?… &emailTo=`[[!print? &pre=`@site.ru`]]`...]], например если поддомен ekb.site.ru, то письмо отправиться на ekb@site.ru.
                      По аналогии можно дописать как угодно снипет print и вставлять имя поддомена в любую часть почты.
                      А вообще formit вроде как умеет брать параметр &emailTo из плейсхолдера, пробуйте через cityFields, создавайте почту через плейсхолдеры, только при выводе не кэшируйте. Мне кажется получиться.
                        Алексей
                        15 августа 2022, 16:25
                        0
                        Как то решили этот вопрос? Тоже столкнулся с такой необходимостью?
                          Сергей Фещуков
                          16 августа 2022, 06:52
                          0
                          Добрый день. Компонент добавляет в miniShop2 кастомный класс cfOrderHandler, в нём реализована отправка заказов из разных городов разным менеджерам. Для этого надо назначить класс cfOrderHandler в качестве класса-обработчика заказов miniShop2 и городам добавлять плейсхолдер ms2_email_manager. Если для города отдельный email менеджера не будет указан, то в качестве адреса отправки будет взято значение системной опции ms2_email_manager.

                          С другой стороны, даже без класса обработчика компонент добавляет в заказ свойство cf.from_city в массив properties с ID города, из которого был сделан заказ. Так что в теле письма вывести город вполне возможно. Но вот чтобы в тему письма добавить метку, наверное надо будет дорабатывать класс cfOrderHandler.
                    Андрей
                    19 августа 2017, 10:45
                    0
                    Подскажите, почему-то если настроен в качестве основного зеркала домен с www, то ссылка на поддомены формируется таким образом: poddomen.www.site.ru то есть перед www ставится поддомен, а нужно после. Как исправить?
                      Сергей Фещуков
                      21 августа 2017, 08:03
                      0
                      Это моё упущение, я обязательно исправлю этот момент, хотя я бы убрал у поддоменов приставку www. Разве она нужна здесь? poddomen.site.ru выглядит лучше и проще запоминается, чем www.poddomen.site.ru.
                        Андрей
                        21 августа 2017, 16:38
                        0
                        Это да, я так пока и вышел из ситуации. Но если например у кого-то у сайта основное зеркало с www, то менять его не есть гуд)) Исправите, было бы круто.
                      Андрей
                      22 августа 2017, 09:18
                      0
                      Не совсем понял как работает определение города по IP. Мне все равно нужно заносить города или компонент может определить город самостоятельно?
                        Rootiys
                        02 ноября 2018, 14:07
                        0
                        Автор компонента пока не отвечает в техподдержке, поэтому спрошу здесь.
                        При включении настройки Город в домене — cityfields_cityindomain — получаю белый экран с ошибками
                        Fatal error: Uncaught Error: Call to undefined function idn_to_utf8() in /var/www/mysite/data/www/ds22.mysite.ru/core/components/cityfields/model/cityfields/cityfields.class.php:83 Stack trace: #0 /var/www/mysite/data/www/ds22.mysite.ru/core/components/cityfields/model/cityfields/cityfields.class.php(46): cityFields->getCurrentCityId() #1 /var/www/mysite/data/www/ds22.mysite.ru/core/xpdo/xpdo.class.php(1234): cityFields->__construct(Object(modX), Array) #2 /var/www/mysite/data/www/ds22.mysite.ru/core/cache/includes/elements/modplugin/19.include.cache.php(5): xPDO->getService('cityfields', 'cityFields', '/var/www/devber...', Array) #3 /var/www/mysite/data/www/ds22.mysite.ru/core/model/modx/modscript.class.php(70): include('/var/www/devber...') #4 /var/www/mysite/data/www/ds22.mysite.ru/core/model/modx/modx.class.php(1608): modScript->process(NULL) #5 /var/www/mysite/data/www/ds22.mysite.ru/core/model/modx/modmanagerrequest.class.php(116): modX->invokeEvent('OnHandleRequest') #6 /var/www/mysite in /var/www/mysite/data/www/ds22.mysite.ru/core/components/cityfields/model/cityfields/cityfields.class.php on line 83
                        Может было у кого такое? Как решить?
                        Нужно срочно сайт запустить.
                          Димыч
                          23 ноября 2018, 20:23
                          0
                          Хотел бы поблагодарить Сергея за отличный компонент и оперативную тех.поддержку. С минимальными усилиями получилось внедрить мультидоменность для разных регионов.
                          Некоторые моменты оказались для меня неочевидными, напишу, может кому пригодится.

                          Мультидоменность в ISP-manager настраивается так — www-домены -> добавляем псевдоним *.site.ru
                          Больше ничего не нужно — любое слово вместо звездочки пойдет поддоменом.
                          Далее ставится сам компонент, прописываются города, и все должно работать.

                          Как сделать sitemap — здесь уже обсуждалось, robots.txt тоже можно сделать динамическим — https://www.youtube.com/watch?v=X-W1T2SG19s
                          Далее я делал примерно так
                          {if $_pls['cf.current_city.id']<>1}{set $gorod=$_pls['cf.current_city.key']~"."}{/if}
                          {$gorod}
                          ...
                          Host: {$gorod}site.ru
                          Sitemap: http://{$gorod}site.ru/sitemap.xml
                          Соответственно, можно для разных городов настраивать нужную индексацию.

                          И сильно помог компонент caseChanger, с помощью которого прописал названия городов в нужных падежах.

                          Единственное пожелание Сергею — документацию сделать нормальную, время потерял, пока разобрался.
                            Денис
                            03 июля 2019, 19:49
                            0
                            Добрый день подскажите, при смене города цена меняется только после очистки кеше в админе. Чистка кеша в браузере не помогает в чем может быть проблема?
                              Сергей
                              03 июля 2019, 23:05
                              0
                              Подскажите пожалуйста, можно ли в поле где создаются плейсхолдеры прикрутить редактор кода, например tinymce?
                                Андрей
                                09 августа 2019, 09:15
                                0
                                Добрый день. Есть ли возможность помимо городов на поддоменах создать такие же регионы на папках?
                                Объясню для чего: для упрямого Google, который упорно не хочет индексировать сайт на поддоменах. Для него планируется закрыть поддомены от индексации, а вместо этого сделать туже схему но на папках внутри основного сайта.
                                Если кто-то решал данную задачу — напишите как можно сделать малой кровью, без копирования сайта/кучи контекстов и т.д.
                                  Андрей
                                  10 августа 2019, 20:25
                                  0
                                  Никто ничего не подскажет?
                                    Rus
                                    Rus
                                    10 августа 2019, 21:05
                                    0
                                    Делайте все на подпапках. Яндекс их тоже норм индексирует
                                      Андрей
                                      10 августа 2019, 21:45
                                      0
                                      На папках как-то можно сделать без клонирования сайта или кучи контекстов? Вот прекрасно все делается с помощью этого компонента. Такую бы тему для папок тоже)
                                        Rus
                                        Rus
                                        11 августа 2019, 01:24
                                        0
                                        Да можно. Мне настраивал Илья Уткин, но последнее время он все время занят, поэтому попробуйте дать задание тут modx.ru/rabota-na-modx/
                                  Мартин Очоа
                                  25 сентября 2019, 04:03
                                  0
                                  Автор, если поддержка и развитие компонента ещё живы, реализуйте, пожалуйста, подпапки, вместо поддоменов — очень просим!
                                    dokreg
                                    13 апреля 2020, 14:33
                                    1
                                    0
                                    Здравствуйте, подскажите как с главной страницы реализовать переход, а то не работает. Работает только на поддомене: domen.ru/ufa/stroyka. А если переход с главной страницы то не работает: к примеру domen.ru/moscow. Как поправить, подскажите пожалуйста?
                                      Сергей Фещуков
                                      15 апреля 2020, 07:29
                                      0
                                      Здравствуйте. Я немного не понял вопроса. Компонент не работает с подпапками. Если только вам его не доработали. У вас ссылки всегда направляют на главный домен? Тогда следует поменять в теге base значение href на
                                      [[!+cf.current_city.url]]
                                      То есть у вас должно получится следующее:
                                      <base href="[[!+cf.current_city.url]]" />
                                        dokreg
                                        16 апреля 2020, 15:45
                                        0
                                        Да, мне его доработали, только вот не пойму почему так происходит, ссылка с главной выглядит так: domen.ru/ufa/?city=3. Если перехожу по этой ссылке — то ничего не происходит, перекидывает снова на главную. Если переходить с какой-либо внутренней страницы — то все норм.
                                          Сергей Фещуков
                                          17 апреля 2020, 13:19
                                          0
                                          Необходимо рассматривать функцию определения города внутри класса cityFields и сам плагин. Перенаправление в двух местах прописано. ?city=3 указывается для выбора города и должно сработать перенаправление на domen.ru/ufa/ после этого. Могли бы мне написать на почту или в поддержку компонента на modstore? Мы бы могли подробнее разобрать ситуацию.
                                      Виктор
                                      12 сентября 2022, 11:05
                                      0
                                      Добрый день. Поддерживает ли приложение собственные домены для каждого города? Или здесь только поддомены?
                                        Сергей Фещуков
                                        12 сентября 2022, 11:52
                                        0
                                        Добрый день. Поддерживаются только поддомены.
                                          Виктор
                                          12 сентября 2022, 13:41
                                          0
                                          Сергей, спасибо за ответ. Есть ли возможность доработать? Сколько это может выйти?
                                        Сергей Макаров
                                        27 июля 2024, 15:30
                                        0
                                        подскажите а как вывести информацию в письме tpl.msEmail в какой город был выбран и сделан заказ*? Заранее спасибо!
                                          Сергей Фещуков
                                          29 июля 2024, 08:19
                                          0
                                          В properties записывается cf.from_city с ID города, можно его использовать в письме. Вроде как так:
                                          {$properties['cf.from_city']}
                                          Но могу ошибаться.
                                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                          47