Все началось с задачи создания магазина услуг для уже действующего сайта. И так уж вышло, что commerce "отказался" устанавливаться и мне пришлось создавать "костыль".
...И даже не спрашивайте о том, что там были за ошибки. Похоже какие-то проблемы с таблицами базы данных. Вобщем не знаю - не было счастья, да несчастье помогло.
Короче, решил я с базой разобраться позже, а магазин сделать на поддомене.
Заодно и с мультисайтингом разобраться.
Задача: Сделать сайт на поддомене и настроить общую пользовательскую авторизацию с головным (родительским) сайтом.
Результат: Один или более дочерних мультисайтов с общими и разными таблицами базы данных с родительским сайтом.
Обратите внимание на п.6 раздела о мультисайтинге. Все действия этого пункта подразумевают, что вы имеет возможность изменять конфигурации вашего apache или возможность контакта с теми, кто может это сделать за вас.
Настоятельно рекомендуется сделать backup сайта и базы данных перед началом создания мультисайтинга!
Мультисайтинг
Для тех, кто не в теме, мультисайтинг - это система при которой есть родительский сайт, а есть дочерние ему сайты - поддомены.
Дочерние сайты по-умолчанию используют модули и темы родительского сайта, но при желании могут заиметь и свои. У них есть собственные папки modules и themes.
Чем удобен мультисайтинг?
Во-первых, тем, что вы можете иметь n-ое количество подсайтов, а фактически - один сайт, который весит, пусть и немного больше, чем обычно, но тем не менее избавляет от необходимости хранить лишние файлы и базы на сервере.
Во-вторых, как я для себя выяснил, именно посредством мультисайтинга активируется возможность создания общих таблиц базы данных между сайтами. Иными словами, вы можете, например, иметь сайты у которых будут общие пользователи, общие представления, блоки и т.п. Не круто ли?))
Ну и в-третьих, с помощью мультисайтинга можно решать проблему с языковым плюрализмом при создании разноязыковых поддоменов.
Как настроить мультисайтинг?
1. Создайте каталог для желаемого сайта в папке /sites родительского сайта. Например: site1.getdrupal8.ru.
2. Создаем папки для файлов, модулей и тем. Не забываем переопределить права этим папкам.
- папка modules;
- папка themes;
- папка files;
- папка files/translations.
В итоге у вас должно получится что-то вроде:
3. Создайте базу данных для нового мультисайта. Тут два варианта:
- либо создать новую базу данных;
- либо указать базу данных имеющегося сайта (например, родительского) добавив префекс к таблицам, например, one_. Как добавить префикс, можно посмотреть тут.
4. Скопируйте файл example.settings.php из папки default в папку дочернего сайта и переименуйте в settings.php.
5. Скопируйте и переименуйте файл default.sites.php в папке sites родительского сайта.
Зайдите в этот файл и добавьте в его конец содержимое по типу:
$sites['site1.getdrupal8.ru'] = 'site1.getdrupal8.ru';
$sites['site2.getdrupal8.ru'] = 'site2.getdrupal8.ru';
где правая часть переменной - это название каталога сайта, а левая - название домена.
6. Используя возможности вашего сервера создайте пути/адреса для вашего домена в apach. Все домены в настройках вашего сервера должны указывать на папку родительского сайта.
Примерный рабочий конфиг:
<VirtualHost *:80>
ServerName site1.getdrupal8.ru
ServerAlias www.site1.getdrupal8.ru
DocumentRoot /var/www/getdrupal8/public_html
<Directory /var/www/getdrupal8/public_html>
AllowOverride All
</Directory>
ErrorLog /var/www/getdrupal8/public_html/sites/site1.getdrupal8.ru/error.log
CustomLog /var/www/getdrupal8/public_html/sites/site1.getdrupal8.ru/access.log combined
</VirtualHost>
Не забудьте добавить к вашим доменам в файле ports на сервере.
P.S. Заметьте, что пути к логам я назначил в корень дочернего сайта, чтобы в случае ошибки разобраться что к чему.
P.S.S. Если есть необходимость в SSL - ставим!
7. Переходим по адресу дочернего сайта, в моем случае это https://site1.getdrupal8.ru и ставим drupal 8. Не забываем про пункт 3.
Бывает, что возникает ошибка невозможности установки из-за некорректных прав. Меняем права на папку translations с возможностью записи и проблема уходит.
С мультисайтингом на этом все! Теперь вы можете использовать ресурсы (модули, темы) сайта родителя на дочернем сайте, а при желании устанавливать свои.
Единое рабочее пространство
Теперь когда мультисайты сделаны и drupal на них установлен, можно поговорить об организации общего доступа к структурным элементам сайта.
Например, можно сделать общедоступным представления, блоки, пользователей... Мне, например, для интернет-магазина нужны были представления и пользователи из родительского сайта.
Попытаюсь подать принцип и механику, а с остальным разбирайтесь сами.
Единый вход
Единый вход для сайтов drupal 8 актуален, как ни где более. Предполагается, что пользователи сайта являются общими для всех мультисайтов. А значит, посетители могут авторизоваться под одними логинами, а разработчики настраивать общие профили и личные кабинеты.
Итак:
1. Активируем общий КЭШ.
1.1 Создаем *services.yml файл с произвольным названием, например, "ENV.services.yml". Наполняем его содержимым (соблюдая разметку и пробелы примера):
где, "getdrupal8.ru" - это родительский домен.
1.2 Помещаем файл в папку default сайта родителя.
1.3 Правим settings.php сайта родителя. Добавляем строчку:
$settings['container_yamls'][] = __DIR__ . '/ENV.services.yml';
Чистим КЭШ.
1.4 Повторяем действия п.1.1
1.5 Помещаем файл в папку default дочернего сайта.
1.6 Правим settings.php дочернего сайта. Добавляем строчку:
$settings['container_yamls'][] = __DIR__ . '/ENV.services.yml';
Чистим КЭШ.
2. Активируем общие таблицы базы.
2.1 В файле settings.php дочернего сайта производим правки подключения таблиц баз данных. В качестве default мы указываем "one_" - что означает, что в качестве основной базы мы выбираем базу дочернего сайта. Таблицы же пользователей "расшариваем" на обе базы:
Таким образом мы активируем возможность использовать таблицы, как сайта родителю, так и дочернему сайту.
Не забываем очистить КЭШ на обоих сайтах.
Открываем оба сайта в инкогнито и проверяем работоспособность системы единого входа. Если все сделано правильно, авторизовавшись на сайте родителя и открыв дочерний сайт вы заметите, что пользователь уже авторизован.
P.S. И да, у меня на сайте родителе и на дочерних сайтах в качестве админа был зарегистрирован пользователь с одним и тем же логином. Возможно, это, как-то влияет на процесс. Если вам удасться проверить работу с разными пользователями, то буду рад увидеть вашу заметку об этом в комментариях.
На этом у меня все! Я надеюсь, что информация была вам полезна и вы сумели настроить мультисайтинг на вашем сервере. Обязательно ставьте лайк и делитесь этой статьей, если это так.