{"id":23181373,"url":"https://github.com/darkfriend/dev2fun.multidomain","last_synced_at":"2025-08-18T13:33:48.066Z","repository":{"id":47622418,"uuid":"118029087","full_name":"darkfriend/dev2fun.multidomain","owner":"darkfriend","description":"Поддомены для 1с-битрикс и мультиязычность для 1с-битрикс. Страны и Города. Легкая настройка.","archived":false,"fork":false,"pushed_at":"2024-09-16T19:43:23.000Z","size":71966,"stargazers_count":19,"open_issues_count":1,"forks_count":14,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-09-17T00:42:01.367Z","etag":null,"topics":["bitrix","module","multidomain","seo","solutions"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darkfriend.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://www.tinkoff.ru/cf/36wVfnMf7mo","https://paypal.me/darkfriend"]}},"created_at":"2018-01-18T19:37:33.000Z","updated_at":"2024-09-16T19:29:48.000Z","dependencies_parsed_at":"2024-09-15T02:41:25.023Z","dependency_job_id":null,"html_url":"https://github.com/darkfriend/dev2fun.multidomain","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkfriend%2Fdev2fun.multidomain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkfriend%2Fdev2fun.multidomain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkfriend%2Fdev2fun.multidomain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkfriend%2Fdev2fun.multidomain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darkfriend","download_url":"https://codeload.github.com/darkfriend/dev2fun.multidomain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230238227,"owners_count":18194988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitrix","module","multidomain","seo","solutions"],"created_at":"2024-12-18T08:15:27.054Z","updated_at":"2024-12-18T08:15:27.661Z","avatar_url":"https://github.com/darkfriend.png","language":"PHP","readme":"# Поддомены и мультиязычность. Страны и Города.\n\nМодуль позволяет добавить в битрикс поддержку множество поддоменов на 1 лицензии битрикса, приложив при этом минимальные усилия.\n\n[Модуль в Маркетплейс Битрикс](http://marketplace.1c-bitrix.ru/solutions/dev2fun.multidomain/#tab-install-link)\n\n## Содержание\n\n\u003c!-- TOC --\u003e\n  * [Что делает модуль:](#что-делает-модуль)\n  * [SEO-поддержка](#seo-поддержка)\n  * [Кому пригодится:](#кому-пригодится)\n  * [Плюсы модуля:](#плюсы-модуля)\n  * [Компоненты](#компоненты)\n  * [Как использовать](#как-использовать)\n    * [Шаг 1. Настройка поддоменов на хостинге (только для режима \"Поддомен\")](#шаг-1-настройка-поддоменов-на-хостинге-только-для-режима-поддомен)\n    * [Шаг 2. Настроить модуль \"Поддомены и мультиязычность\"](#шаг-2-настроить-модуль-поддомены-и-мультиязычность)\n      * [Вкладка \"Настройки\"](#вкладка-настройки)\n      * [Вкладка \"Домены\"](#вкладка-домены)\n      * [Вкладка \"Мультиязычность\"](#вкладка-мультиязычность)\n        * [Локализация (языки)](#локализация-языки)\n          * [Шаги:](#шаги)\n          * [Интеграция локализации полей в компоненты](#интеграция-локализации-полей-в-компоненты)\n          * [Локализация подписей и надписей в шаблоне](#локализация-подписей-и-надписей-в-шаблоне)\n      * [Вкладка  \"SEO\"](#вкладка-seo)\n    * [Шаг 3. Указать все поддерживаемые поддомены + основной домен](#шаг-3-указать-все-поддерживаемые-поддомены--основной-домен)\n      * [Шаг 3.1](#шаг-31)\n      * [Шаг 3.2](#шаг-32)\n    * [Шаг 4. Настройка seo-шаблонов](#a-nameseopattersa-шаг-4-настройка-seo-шаблонов)\n    * [Шаг 5. Интеграция в компоненты](#шаг-5-интеграция-в-компоненты)\n      * [Пример на компоненте `bitrix:catalog`](#пример-на-компоненте-bitrixcatalog)\n  * [Шаг 6. Настройка битрикса](#шаг-6-настройка-битрикса)\n  * [Для программистов](#для-программистов)\n      * [Получить информацию о текущем домене](#получить-информацию-о-текущем-домене)\n      * [Получить язык текущего домена](#получить-язык-текущего-домена)\n      * [Получить имя поддомена](#получить-имя-поддомена)\n      * [Получить все sef-folder](#получить-все-sef-folder)\n      * [Получить все поддомены](#получить-все-поддомены)\n      * [Получить поддомен по фильтру](#получить-поддомен-по-фильтру)\n    * [Поддерживаемые события](#поддерживаемые-события)\n  * [Миграции на новые версии](#migrations)\n  * [Техническая поддержка](#техническая-поддержка)\n  * [Поддержка выпуска обновлений (донаты)](#поддержка-выпуска-обновлений)\n\u003c!-- TOC --\u003e\n\n## Что делает модуль:\n\n* Добавляет возможность создания **бесконечного** числа **поддоменов**\n* Добавляет **SEO-поддержку** для каждого **поддомена**\n* Добавляет **SEO-поддержку** для каждой **страницы**\n* Добавляет возможность указать **счетчики и мета-теги** для каждого поддомена\n* Позволяет включить поддержку **мультиязычности** и автоматическое переключение языка\n* Позволяет **автоматически** определять **город** пользователя\n* Позволяет **автоматически** определять **страну** пользователя\n* Позволяет создавать **любые дополнительные поля** с привязкой к домену\n* Позволяет динамически подставлять любое значение в заголовок, title, description, keywords с привязкой к домену\n\n## SEO-поддержка\n\nМодуль позволяет задать SEO для каждой страницы с привязкой к домену.\n\nТакже вы сможете:\n\n* задать **SEO-текст для каждой страницы** с привязкой к домену\n* задать **H1-текст для каждой страницы** с привязкой к домену\n* задать **TITLE для каждой страницы** с привязкой к домену\n* задать **Description для каждой страницы** с привязкой к домену\n* задать **Keywords для каждой страницы** с привязкой к домену\n* создать **любые дополнительные поля** для каждой страницы с привязкой к домену\n* указать общий **паттерн формирования BROWSER TITLE**\n* локализовать поля под любой язык\n\n## Кому пригодится:\n\n* кто хочет продвигать свой сайт точечно в любом городе\n* кто хочет продвигать свой сайт точечно в любой стране\n* кому нужно переключать язык сайта в зависимости от страны\n* кому нужна тонкая SEO-настройка\n* кому нужна поддержка разных языков\n\n## Плюсы модуля:\n\n* почти любой функционал можно включать/отключать\n* возможность полного управления\n* гибкая SEO-поддержка каждой страницы\n* гибкая SEO-поддержка каждого домена\n* очень легкая настройка\n* множество режимов работы\n* возможность исключать пути\n* возможность задавать соответствия\n* не использует сторонние сервисы\n* возможность сделать локализацию полей\n* поддержка городов, стран и языков\n* поддержка ЧПУ\n\n## Компоненты\n* `multidomain.city.list` - компонент для вывода списка поддоменов\n* `multidomain.data` - компонент для вывода информации текущего поддомена\n* `multidomain.page` - компонент для вывода статических страниц для мультиязычности\n\n## Как использовать\n\n### Шаг 1. Настройка поддоменов на хостинге (только для режима \"Поддомен\")\n\nЧтоб настроить поддомены на хостинге вам необходимо будет указать алиасы. \nЕсли у вас хостинг, то можете попросить хостера сделать чтобы все домены вида *.mysite.ru вели на корень сайта.\nОбычно для этого надо сделать что-то вроде такого: \n- Прописать днс-запись\n    * IN     A    IP сервера\n- В настройках apache прописать:\n    - ServerName your_site.ru \n    - ServerAlias *.your_site.ru\n\n### Шаг 2. Настроить модуль \"Поддомены и мультиязычность\"\n\n#### Вкладка \"Настройки\"\n\n* Алгоритм - указать алгоритм определения поддоменов\n    * **Поддомен** - модуль определяет такой тип `subdomain.domain.ru`, где subdomain является поддоменом.\n    * **Подпапка** - модуль определяет такой тип `domain.ru/subdomain/`, где subdomain является поддоменом.\n* Тип - указать какой тип поддоменов.\n    * **Страны** - режим стран\n    * **Города** - режим городов\n    * **Язык** - режим языков\n    * **Виртуальный** - виртуальный режим, не производит редиректов и переустановку свойств битрикса. Все данные лежат в свойствах модуля и их можно получить.\n* Включить замену ссылок - работает при алгоритме **подпапка**, заменяет все ссылки\n* Ключ обнаружения IP - ключ в массиве $_SERVER в котором указан ip пользователя\n* Домен по умолчанию - указать домен который является по умолчанию. Можно указать поддомен.\n* Сопоставления - алгоритм сопоставления iso-кода страны/города к имени поддомена.\n* Исключить пути - регулярные выражения путей, на которых модуль не запускается\n    * По умолчанию указаны след пути:\n        * `/bitrix/*`\n        * `/local/*`\n        * и все файлы которые заканчиваются на `.php`\n* Управление маршрутизацией - при нажатии на кнопку \"обновить urlrewrite\", делает проверку и добавляет нужные правила маршрутизации\n\n#### Вкладка \"Домены\"\n\nОписание указано ниже (п. Настроить \"Поддомены\")\n\n#### Вкладка \"Мультиязычность\"\n\n* Включить мультиязычность - при установленной галке мультиязычность работает\n* Язык по умолчанию - код языка по умолчанию, в нижнем регистре\n* Выводить HREFLANG - выводит указатели в head на другие языки у каждой из страниц\n* Поддержка переводов - указываются все поля для которых должны быть языковые версии\n\n##### Локализация (языки)\nВ модуле с версии 0.2.0 есть поддержка локализации полей.\n###### Шаги:\n1. добавить поддержку полей в настройках модуля\n1. заполнить данные в полях на страницах редактирования элементов и разделов\n1. сделать интеграцию модуля в шаблоны компонентов (ниже подробнее)\n1. сделать локализацию подписей и надписей в шаблоне\n\n###### Интеграция локализации полей в компоненты\n\n**Локализация у списков элементов/разделов**\n\nВам необходимо прописать в result_modifier.php шаблона используемого компонента следующее:\n```php\n// подгружаем все модуль и все его классы\n\\Bitrix\\Main\\Loader::includeModule('dev2fun.multidomain');\n$arItems = \\Dev2fun\\MultiDomain\\LangData::getLangItemsFields($arItems, 'element');\n// где $arItems - массив элементов или разделов\n// где element - тип, т.к. element - для элементов, section - для разделов\n```\n\n**Локализация у элементов**\n\nВам необходимо прописать в result_modifier.php шаблона используемого компонента следующее:\n```php\n// подгружаем все модуль и все его классы\n\\Bitrix\\Main\\Loader::includeModule('dev2fun.multidomain');\n$arResult = \\Dev2fun\\MultiDomain\\LangData::getDataFields($arResult,'element');\n// где arResult - массив полей элемента\n// где element - тип, т.к. мы выводим для элемента, поэтому element\n```\n\n**Локализация у разделов**\n\nВам необходимо прописать в result_modifier.php шаблона используемого компонента следующее:\n```php\n// подгружаем все модуль и все его классы\n\\Bitrix\\Main\\Loader::includeModule('dev2fun.multidomain');\n$arResult = \\Dev2fun\\MultiDomain\\LangData::getDataFields($arResult,'section');\n// где arResult - массив полей раздела\n// где section- тип, т.к. мы выводим для раздела, поэтому section\n```\n\n###### Локализация подписей и надписей в шаблоне\n\nВначале файла необходимо загрузить файл переводов (например файл `header.php`)\n```php\n\u003c?php\n\n\\Dev2fun\\MultiDomain\\LangData::loadMessages(__FILE__);\n```\n\nДалее в нужных местах сделать подключение переводов\n```html\n\u003cspan\u003e\u003c?=\\Dev2fun\\MultiDomain\\LangData::getMessage('HI');?\u003e\u003c/span\u003e\n```\n\nЕсли `LangData::loadMessages` был вызван в файле `header.php`, то переводы будут по пути: `/путь_до_шаблона/lang/код_языка/header.php`.\n\nСостав файла для `ru`:\n```php\n\u003c?php\n$MESS['HI'] = 'Привет';\n//$MESS['OTHER'] = 'Другое';\n// другие переводы\n```\n\nСостав файла для `en`:\n```php\n\u003c?php\n$MESS['HI'] = 'Hi';\n//$MESS['OTHER'] = 'Other';\n// другие переводы\n```\n\n#### Вкладка  \"SEO\"\n\n* Включить SEO - при установке включается SEO у всех доменов и поддоменов. На сайте, для админов, выводится кнопка настройки сео.\n* ~~Активировать SEO-паттерн для title - активирует поле с SEO-паттерном ниже. В данный момент модуль поддерживает паттерны:~~ (устаревшее, используйте [паттерны](#seoPatters))\n    * ~~\\#TITLE\\# - текущий title страницы~~\n    * ~~\\#CITY\\# - город~~\n\n### Шаг 3. Указать все поддерживаемые поддомены + основной домен\n\n#### Шаг 3.1\nВам нужно в админке по пути:  ``Настройки-\u003eНастройки продукта-\u003eСайты-\u003eСписок сайтов-\u003eвыбираете нужный сайт (обычно s1)`` и прописываете в поле \"Доменной имя\", список доменных имен, каждый домен на новой строке.\n\n#### Шаг 3.2\nПуть: ``Настройки-\u003eНастройки продукта-\u003eНастройки модулей-\u003eПоддомены и мультиязычность-\u003eВкладка Домены-\u003eнажать на ссылку``\n\nПройдясь по вышеуказанному пути мы попадаем в хайлоадблок битрикса **\"Dev2funMultiDomain\"**\\\n\nВ нем создаем записи. Каждая запись соответствует поддерживаемому домену\\\n\nСвойства:\n* **Активность** - указывает на активность домена\n* **Название** - внутреннее название домена (любое, не влияет на систему)\n* **Подддомен** - указываем название поддомена, например нам нужен вот такой вид my.domain.ru, то в этом поле указываем my\n* **Главный домен** - указываем название главного домена, в нашем случае domain.ru\n* **HTML-код счетчиков** - сюда копируем все нужные счетчики учета (например Yandex.Metrika или Google Analytics)\n* **HTML-код мета-тегов** - сюда копируем мета-теги для разных верификаций и любые другие, которые нужно вывести для этого поддомена\n* **Язык** - тут указываем язык поддомена. Работает только **при включении Мультиязычности**. А **если указать redirect**, то система будет проверять пользователя и перенаправлять его на нужный поддомен.\n\n### \u003ca name=\"seoPatters\"\u003e\u003c/a\u003e Шаг 4. Настройка seo-шаблонов\n\n1. Заходите в настройки нужного инфоблока\n2. Переходите во вкладку SEO\n3. Указываете шаблоны в нужных местах\n\nСписок поддерживаемых шаблонов:\n* `{=multiTitle}` - для Meta Title (разделы/элементы)\n* `{=multiDescription}` - для Meta Description (разделы/элементы)\n* `{=multiKeywords}` - для Meta Keywords (разделы/элементы)\n* `{=multiHeading}` - для заголовка раздела/элемента\n* `{=multiLangField}` - для языкового (перевода) заголовка раздела/элемента\n\nСтруктура щаблона на примере Meta Title: `{=multiTitle \"FieldName\", \"BeforeText\", \"AfterText\", \"AdditionData\"}`\\\nГде:\n* FieldName - это название поле откуда выводить текст (По умолчанию UF_NAME), \n* BeforeText - это текст до, \n* AfterText - это текст после, \n* AdditionData - любая дополнительная информация перечисленная через запятую (отсутствует у `{=multiLangField}`)\n\nПо итогу вы увидите json, который заменяется на нужные данные.\n**Не забудьте поставить галку на \"Очистить кеш вычисленных значений\"**\n\n### Шаг 5. Интеграция в компоненты\n\nВ режиме \"подпапка\" рекомендуется для комплексных компонентов или компонентов с ЧПУ указать `SEF_FOLDER`.\n\n#### Пример на компоненте `bitrix:catalog`\n\n```php\n\u003c?php\n$sefFolder = \\Dev2fun\\MultiDomain\\Base::getSefFolder();\n?\u003e\n\u003c?php $APPLICATION-\u003eIncludeComponent(\n    \"bitrix:catalog\", \n    \"bootstrap_v4\", \n    array(\n        \"IBLOCK_TYPE\" =\u003e \"catalog\",\n        \"IBLOCK_ID\" =\u003e \"2\",\n        \"TEMPLATE_THEME\" =\u003e \"site\",\n        \"HIDE_NOT_AVAILABLE\" =\u003e \"N\",\n        \"BASKET_URL\" =\u003e \"{$sefFolder}/personal/cart/\",\n        \"SEF_MODE\" =\u003e \"Y\",\n        \"SEF_FOLDER\" =\u003e \"{$sefFolder}/catalog/\",\n        \"AJAX_MODE\" =\u003e \"N\",\n        \"AJAX_OPTION_JUMP\" =\u003e \"N\",\n        \"AJAX_OPTION_STYLE\" =\u003e \"Y\",\n        \"AJAX_OPTION_HISTORY\" =\u003e \"N\",\n        \"CACHE_TYPE\" =\u003e \"A\",\n        \"CACHE_TIME\" =\u003e \"36000000\",\n        \"CACHE_FILTER\" =\u003e \"Y\",\n        \"CACHE_GROUPS\" =\u003e \"Y\",\n        \"SET_TITLE\" =\u003e \"Y\",\n        \"STORE_PATH\" =\u003e \"{$sefFolder}/store/#store_id#\",\n        \"SEF_URL_TEMPLATES\" =\u003e array(\n            \"sections\" =\u003e \"\",\n            \"section\" =\u003e \"#SECTION_CODE#/\",\n            \"element\" =\u003e \"#SECTION_CODE#/#ELEMENT_CODE#/\",\n            \"compare\" =\u003e \"compare/\",\n            \"smart_filter\" =\u003e \"#SECTION_CODE#/filter/#SMART_FILTER_PATH#/apply/\",\n        )\n        // .... другие свойства\n    ),\n    false\n);?\u003e\n```\n\n## Шаг 6. Настройка битрикса\n\n* Перейти на страницу `Настройки-\u003eСайты-\u003eСписок сайтов`\n* Выберите нужный сайт\n* Указать \"Доменное имя\"\n* Указать правильный \"Путь к корневой папке веб-сервера для этого сайта\"\n\n## Для программистов\n\n#### Получить информацию о текущем домене\n``Dev2fun\\MultiDomain\\Base::GetCurrentDomain()``\n\n#### Получить язык текущего домена\n``Dev2fun\\MultiDomain\\Base::GetCurrentDomain()['UF_LANG']``\n\n#### Получить имя поддомена\n``Dev2fun\\MultiDomain\\Base::GetCurrentDomain()['UF_SUBDOMAIN']``\n\n#### Получить все sef-folder\n``Dev2fun\\MultiDomain\\Base::getSefFolder()``\n\n#### Получить все поддомены\n``Dev2fun\\MultiDomain\\SubDomain::getInstance()-\u003egetDomainList()``\n\n#### Получить поддомен по фильтру\nФильтр передается как callback (для array_filter).\\\n``Dev2fun\\MultiDomain\\SubDomain::getInstance()-\u003egetDomainByFilter($callbackFilter)``\n\n### Поддерживаемые события\n\n|  название события | передаваемые переменные                                                                 | описание                                                                     \n|---|-----------------------------------------------------------------------------------------|------------------------------------------------------------------------------| \n | `OnBeforeSeoSetCityName`  | `\u0026$cityName` - название города\u003cbr\u003e`$currentDomain` - массив полей текущего домена       | Событие запускается перед заменой seo-шаблона `{=get_city}`                    |\n | `onBeforeFindDomain`  | `$domains` - домен\u003cbr\u003e`$domainFilters` - объект фильтров                                | Событие запускается перед получением домена                                  |\n | `onBeforeFindDomains`  | `$domains` - массив доменов\u003cbr\u003e`$domainFilters` - объект фильтров                       | Событие запускается перед получением списка доменов                          |\n | `onAfterFindCurrentSubdomain`  |                                                                                         | Событие запускается после обнаружения текущего домена                        |\n | `onBeforeSetNotFound`  | `$isSetNotFound` (bool) - флаг установки ошибки 404, при не определении текущего домена | Событие запускается до установки ошибки 404 |\n\n## Migrations\n_Note: Данный раздел обязателен для тех, кто обновляется через гитхаб. Если вы **обновляетесь через систему обновления битрикса**, то эти действия выполнять **не нужно**_\n\n**_Note2: Начиная с версии 1.1.8 данный раздел перенесен в [changelog-файл](CHANGELOG.md)_**\n\n## Техническая поддержка\n\nПоддержку решения осуществляет @darkfriend от команды [dev2fun](http://dev2fun.com)\nВы можете найти меня по этому нику в [telegram](https://t.me/darkfriend) или написав на почту support@dev2fun.com\n\n## Поддержка выпуска обновлений\n\n|   |  |\n| ------------- | ------------- |\n| Yandex.Money  | 410011413398643  |\n| Webmoney WMR (rub)  | R218843696478  |\n| Webmoney WMU (uah)  | U135571355496  |\n| Webmoney WMZ (usd)  | Z418373807413  |\n| Webmoney WME (eur)  | E331660539346  |\n| Webmoney WMX (btc)  | X740165207511  |\n| Webmoney WML (ltc)  | L718094223715  |\n| Webmoney WMH (bch)  | H526457512792  |\n| PayPal  | [@darkfriend](https://www.paypal.me/darkfriend)  |\n| Payeer  | P93175651  |\n| Bitcoin  | 15Veahdvoqg3AFx3FvvKL4KEfZb6xZiM6n  |\n| Litecoin  | LRN5cssgwrGWMnQruumfV2V7wySoRu7A5t  |\n| Ethereum  | 0xe287Ac7150a087e582ab223532928a89c7A7E7B2  |\n| BitcoinCash  | bitcoincash:qrl8p6jxgpkeupmvyukg6mnkeafs9fl5dszft9fw9w  |\n","funding_links":["https://www.tinkoff.ru/cf/36wVfnMf7mo","https://paypal.me/darkfriend","https://www.paypal.me/darkfriend"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkfriend%2Fdev2fun.multidomain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarkfriend%2Fdev2fun.multidomain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkfriend%2Fdev2fun.multidomain/lists"}