[cityFields] Определение города по домену
Новая версия компонента cityFields приносит самый ожидаемый функционал — определение города по домену. И в данной статье я опишу процесс настройки этой возможности.
Начнём с того, что создадим свой список городов на странице компонента, если вы этого ещё не сделали. Ключ — это наш будущий поддомен для города.
Теперь создадим соответствующие поддомены на вашем хостинге и подключим их к сайту по тому же пути, что и основной сайт. Если вы пользуетесь SSL-сертификатом, необходимо будет перевыпустить его, добавив в него новые поддомены.
Включаем возможность определения города по домену в настройках компонента.
Если вы изменяли стандартный код чанка cfCities.row, JS-файла или обновлялись до новой версии, необходимо добавить ссылки для переключения города. Стандартный код чанка cfCities.row теперь выглядит так:
Теперь проверьте вашу работу. Если у вас возникли какие-либо вопросы или проблемы, пишите тикеты в поддержку на modstore.pro, а также можете оставлять комментарии к данной записи. Как работает переключение городов на деле можно увидеть на демо сайте.
И стоит отдельно отметить и другие изменения у компонента:
Начнём с того, что создадим свой список городов на странице компонента, если вы этого ещё не сделали. Ключ — это наш будущий поддомен для города.
Теперь создадим соответствующие поддомены на вашем хостинге и подключим их к сайту по тому же пути, что и основной сайт. Если вы пользуетесь 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.
Поблагодарить автора
Отправить деньги
Комментарии: 47
Очень волнуют эти вопросы:
1. Возможна ли реализация городов в подкатегориях (site.ru/moskva/...)
2. Нужно ли создавать контексты для каждого города (если да, то добавление нового ресурса создается автоматически)?
1. Возможна ли реализация городов в подкатегориях (site.ru/moskva/...)
2. Нужно ли создавать контексты для каждого города (если да, то добавление нового ресурса создается автоматически)?
1. На текущий момент реализованы только города в поддоменах. В подкатегориях будет добавлено в ближайших версиях после того, как будут исправлены баги с реализацией городов в поддоменах, если они появятся. Так как города в подкатегориях будут основываться на этом же механизме.
2. Прелесть этого компонента в том, что нет необходимости создавать под каждый город контексты. Если вам необходимо внутри содержимого ресурса использовать разные фрагменты текста для разных городов, необходимо использовать данные и выводить их с помощью сниппета/модификатора cfField или плейсхолдером (если опция включена).
2. Прелесть этого компонента в том, что нет необходимости создавать под каждый город контексты. Если вам необходимо внутри содержимого ресурса использовать разные фрагменты текста для разных городов, необходимо использовать данные и выводить их с помощью сниппета/модификатора cfField или плейсхолдером (если опция включена).
1. Возможно ли за доплату в индивидуальном порядке реализовать этот функционал?
2. Отлично, что не нужно создавать контексты. В этой связи возникают еще пару вопросов:
а) подставляются ли переменные в метаданных (title, description);
б) как создается карта сайта? Будут ли в сайтмапе ссылки на все страницы каждого города? Хотя, этот вопрос больше относится к городам в подкатегории.
2. Отлично, что не нужно создавать контексты. В этой связи возникают еще пару вопросов:
а) подставляются ли переменные в метаданных (title, description);
б) как создается карта сайта? Будут ли в сайтмапе ссылки на все страницы каждого города? Хотя, этот вопрос больше относится к городам в подкатегории.
1. Этот функционал всё равно будет добавляться в компонент, так что только для вас его не получится добавить. За плату можно только простимулировать меня быстрее заняться этим вопросом. :)
2а. Автоматически не подставляется. Как у вас реализован вывод title и description?
2б. Карта сайта будет создаваться со ссылками по умолчанию, без учёта городов. Стандартная настройка site_url не подменяется.
2а. Автоматически не подставляется. Как у вас реализован вывод title и description?
2б. Карта сайта будет создаваться со ссылками по умолчанию, без учёта городов. Стандартная настройка site_url не подменяется.
тайтлы пока еще никак не реализованы. Узнал о существовании MODX неделю назад. Но мне нужно, чтобы переменные подставлялись и в метаданные. Также важна карта сайта.
Большое спасибо за быстрые ответы. К сожалению, с данным функционалом ваш компонент не смогу применить.
Большое спасибо за быстрые ответы. К сожалению, с данным функционалом ваш компонент не смогу применить.
Добрый день!
Реализован на данный момент функционал выбора города в подкатегориях (site.ru/moskva/...)?
Реализован на данный момент функционал выбора города в подкатегориях (site.ru/moskva/...)?
На данный момент, к сожалению, такой функционал ещё не реализован
Добрый день у меня на сайте уже созданы контексты, данное дополнение с ними работать будет?
2. Можно ли реализовать какой то сброс всех тв полей для каждого контекста?
К примеру у каждого города есть метро и районы если у менеджера в ТВ Автодополении будет районы всех городов то это крайне не удобно.
Так же на сайте реализованы теги, которые подобраны для определенного города и они высвечиваются во всех контекстах. Думаю суть проблемы понятна.
2. Можно ли реализовать какой то сброс всех тв полей для каждого контекста?
К примеру у каждого города есть метро и районы если у менеджера в ТВ Автодополении будет районы всех городов то это крайне не удобно.
Так же на сайте реализованы теги, которые подобраны для определенного города и они высвечиваются во всех контекстах. Думаю суть проблемы понятна.
Добрый день.
1. Компонент не работает с контекстами. Оно создано специально для того, чтобы не создавать контексты для разных городов. Дописать этот функционал возможно, в принципе, или переписать под ваши нужды его.
2. Придётся переписать тип ТВ или создать новый, чтобы поддерживал компонент. В общем, без правки такой функции не будет, но вообще реализовать можно.
3. Опять же вопрос к автодополнениям, поддержку городов придётся дописывать.
1. Компонент не работает с контекстами. Оно создано специально для того, чтобы не создавать контексты для разных городов. Дописать этот функционал возможно, в принципе, или переписать под ваши нужды его.
2. Придётся переписать тип ТВ или создать новый, чтобы поддерживал компонент. В общем, без правки такой функции не будет, но вообще реализовать можно.
3. Опять же вопрос к автодополнениям, поддержку городов придётся дописывать.
Сергей, пожалуйста когда-нибудь дайте возможность, в настройках города — отметить точку(и) на яндекс карте.
Сергей, я просто вывел ваш снипет, добавил пару городов в настройках, поддомены добавил.
…
И все, — города переключаются, но почему URL не меняется.
Всегда Site.ru а не msk.site.ru или spb.site.ru
Что я забыл?
…
И все, — города переключаются, но почему URL не меняется.
Всегда Site.ru а не msk.site.ru или spb.site.ru
Что я забыл?
А в настройках компонента включили определение города по домену?
Зря не посмотрел системные настройки / CityFields… Спасибо., четкий компонент.
1. Проблема. У меня url генерируется без точки, т.е. Gorodsite.ru вместо Gorod.site.ru
Так происходит только с одним городом, поддомен которого был выключен и CityFields эту ссылку как то запомнил хитро. Никак не могу избавиться.
Пробывал удалять и ставить заново, но ссылка генерируется все равно — «Gorodsite.ru»
А нормальные, включенный с самого начала поддомен, открывается как положено, с точкой.
2. Просьба расширить функционал в новой версии CityFields
Опцией в настройках при выборе которой, если город не определился — то открываеся site.ru
а жители городов например Москва, попадали в соотв. поддомены типа moskva.site.ru
И еще хочется опцию в настройках, с которой при заходе на site.ru, сайт спрашивает:
Ваш город: Пермь? Далее посетитель нажимает «Пермь» — и срабатывает редирект perm.site.ru
Так происходит только с одним городом, поддомен которого был выключен и CityFields эту ссылку как то запомнил хитро. Никак не могу избавиться.
Пробывал удалять и ставить заново, но ссылка генерируется все равно — «Gorodsite.ru»
А нормальные, включенный с самого начала поддомен, открывается как положено, с точкой.
2. Просьба расширить функционал в новой версии CityFields
Опцией в настройках при выборе которой, если город не определился — то открываеся site.ru
а жители городов например Москва, попадали в соотв. поддомены типа moskva.site.ru
И еще хочется опцию в настройках, с которой при заходе на site.ru, сайт спрашивает:
Ваш город: Пермь? Далее посетитель нажимает «Пермь» — и срабатывает редирект perm.site.ru
1. Попробуйте заново скачать компонент из магазина и переустановить его. Такой косяк был, но я его поправил.
2. Хорошо, я реализую такой функционал в ближайшем обновлении.
2. Хорошо, я реализую такой функционал в ближайшем обновлении.
Спасибо, помогло. Это хостинг у меня какие-то папки создал…
Благодарю, буду очень ждать обновление.
Вопрос. CityFields сам географию по айпишнику определяет, и редиректит с site.ru на gorod.site.ru Верно?
Просто авто-редирект перестал работать после того как я решал прошлую проблему…
«Город в домене» в системных настройках включено.
Деинсталировать, Удалять, заново ставить попробывал.
С хостинга может быть удалить какую-нить папку?
ps После полного удаления в настройках «Управление городами и данными» поля заполнять не требуется, т.е. заполненные города остаются.
Благодарю, буду очень ждать обновление.
Вопрос. CityFields сам географию по айпишнику определяет, и редиректит с site.ru на gorod.site.ru Верно?
Просто авто-редирект перестал работать после того как я решал прошлую проблему…
«Город в домене» в системных настройках включено.
Деинсталировать, Удалять, заново ставить попробывал.
С хостинга может быть удалить какую-нить папку?
ps После полного удаления в настройках «Управление городами и данными» поля заполнять не требуется, т.е. заполненные города остаются.
здравствуйте, а можно ли использовать компонент в системных настройках minishop2 для указания email менеджеров, что при отправки с разных городов письма отправлялись на разные ящики?
Добрый день. К сожалению, такого не реализовано. Первый раз сталкиваюсь с такой необходимостью. Надо будет подумать как это грамотно реализовать.
может можно в системную переменную как то передать значение?
проблема остается актуальной… может появились идеи реализации?
Если сайт на поддоменах и отправка форм через 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, создавайте почту через плейсхолдеры, только при выводе не кэшируйте. Мне кажется получиться.
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, создавайте почту через плейсхолдеры, только при выводе не кэшируйте. Мне кажется получиться.
Как то решили этот вопрос? Тоже столкнулся с такой необходимостью?
Добрый день. Компонент добавляет в miniShop2 кастомный класс cfOrderHandler, в нём реализована отправка заказов из разных городов разным менеджерам. Для этого надо назначить класс cfOrderHandler в качестве класса-обработчика заказов miniShop2 и городам добавлять плейсхолдер ms2_email_manager. Если для города отдельный email менеджера не будет указан, то в качестве адреса отправки будет взято значение системной опции ms2_email_manager.
С другой стороны, даже без класса обработчика компонент добавляет в заказ свойство cf.from_city в массив properties с ID города, из которого был сделан заказ. Так что в теле письма вывести город вполне возможно. Но вот чтобы в тему письма добавить метку, наверное надо будет дорабатывать класс cfOrderHandler.
С другой стороны, даже без класса обработчика компонент добавляет в заказ свойство cf.from_city в массив properties с ID города, из которого был сделан заказ. Так что в теле письма вывести город вполне возможно. Но вот чтобы в тему письма добавить метку, наверное надо будет дорабатывать класс cfOrderHandler.
Подскажите, почему-то если настроен в качестве основного зеркала домен с www, то ссылка на поддомены формируется таким образом: poddomen.www.site.ru то есть перед www ставится поддомен, а нужно после. Как исправить?
Это моё упущение, я обязательно исправлю этот момент, хотя я бы убрал у поддоменов приставку www. Разве она нужна здесь? poddomen.site.ru выглядит лучше и проще запоминается, чем www.poddomen.site.ru.
Это да, я так пока и вышел из ситуации. Но если например у кого-то у сайта основное зеркало с www, то менять его не есть гуд)) Исправите, было бы круто.
Не совсем понял как работает определение города по IP. Мне все равно нужно заносить города или компонент может определить город самостоятельно?
Автор компонента пока не отвечает в техподдержке, поэтому спрошу здесь.
При включении настройки Город в домене — cityfields_cityindomain — получаю белый экран с ошибками
Нужно срочно сайт запустить.
При включении настройки Город в домене — 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
Может было у кого такое? Как решить?Нужно срочно сайт запустить.
Хотел бы поблагодарить Сергея за отличный компонент и оперативную тех.поддержку. С минимальными усилиями получилось внедрить мультидоменность для разных регионов.
Некоторые моменты оказались для меня неочевидными, напишу, может кому пригодится.
Мультидоменность в ISP-manager настраивается так — www-домены -> добавляем псевдоним *.site.ru
Больше ничего не нужно — любое слово вместо звездочки пойдет поддоменом.
Далее ставится сам компонент, прописываются города, и все должно работать.
Как сделать sitemap — здесь уже обсуждалось, robots.txt тоже можно сделать динамическим — https://www.youtube.com/watch?v=X-W1T2SG19s
Далее я делал примерно так
И сильно помог компонент caseChanger, с помощью которого прописал названия городов в нужных падежах.
Единственное пожелание Сергею — документацию сделать нормальную, время потерял, пока разобрался.
Некоторые моменты оказались для меня неочевидными, напишу, может кому пригодится.
Мультидоменность в 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, с помощью которого прописал названия городов в нужных падежах.
Единственное пожелание Сергею — документацию сделать нормальную, время потерял, пока разобрался.
Добрый день подскажите, при смене города цена меняется только после очистки кеше в админе. Чистка кеша в браузере не помогает в чем может быть проблема?
Подскажите пожалуйста, можно ли в поле где создаются плейсхолдеры прикрутить редактор кода, например tinymce?
Добрый день. Есть ли возможность помимо городов на поддоменах создать такие же регионы на папках?
Объясню для чего: для упрямого Google, который упорно не хочет индексировать сайт на поддоменах. Для него планируется закрыть поддомены от индексации, а вместо этого сделать туже схему но на папках внутри основного сайта.
Если кто-то решал данную задачу — напишите как можно сделать малой кровью, без копирования сайта/кучи контекстов и т.д.
Объясню для чего: для упрямого Google, который упорно не хочет индексировать сайт на поддоменах. Для него планируется закрыть поддомены от индексации, а вместо этого сделать туже схему но на папках внутри основного сайта.
Если кто-то решал данную задачу — напишите как можно сделать малой кровью, без копирования сайта/кучи контекстов и т.д.
Никто ничего не подскажет?
Делайте все на подпапках. Яндекс их тоже норм индексирует
На папках как-то можно сделать без клонирования сайта или кучи контекстов? Вот прекрасно все делается с помощью этого компонента. Такую бы тему для папок тоже)
Да можно. Мне настраивал Илья Уткин, но последнее время он все время занят, поэтому попробуйте дать задание тут modx.ru/rabota-na-modx/
Автор, если поддержка и развитие компонента ещё живы, реализуйте, пожалуйста, подпапки, вместо поддоменов — очень просим!
Здравствуйте, подскажите как с главной страницы реализовать переход, а то не работает. Работает только на поддомене: domen.ru/ufa/stroyka. А если переход с главной страницы то не работает: к примеру domen.ru/moscow. Как поправить, подскажите пожалуйста?
Здравствуйте. Я немного не понял вопроса. Компонент не работает с подпапками. Если только вам его не доработали. У вас ссылки всегда направляют на главный домен? Тогда следует поменять в теге base значение href на
[[!+cf.current_city.url]]
То есть у вас должно получится следующее:<base href="[[!+cf.current_city.url]]" />
Да, мне его доработали, только вот не пойму почему так происходит, ссылка с главной выглядит так: domen.ru/ufa/?city=3. Если перехожу по этой ссылке — то ничего не происходит, перекидывает снова на главную. Если переходить с какой-либо внутренней страницы — то все норм.
Необходимо рассматривать функцию определения города внутри класса cityFields и сам плагин. Перенаправление в двух местах прописано. ?city=3 указывается для выбора города и должно сработать перенаправление на domen.ru/ufa/ после этого. Могли бы мне написать на почту или в поддержку компонента на modstore? Мы бы могли подробнее разобрать ситуацию.
Добрый день. Поддерживает ли приложение собственные домены для каждого города? Или здесь только поддомены?
Добрый день. Поддерживаются только поддомены.
Сергей, спасибо за ответ. Есть ли возможность доработать? Сколько это может выйти?
подскажите а как вывести информацию в письме tpl.msEmail в какой город был выбран и сделан заказ*? Заранее спасибо!
В properties записывается cf.from_city с ID города, можно его использовать в письме. Вроде как так:
{$properties['cf.from_city']}
Но могу ошибаться.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.