Domains and Drupal 8
Vitalii Zinenko vzinenko@adyax.com
Andrey Postnikov apostnikov@gmail.com
Domains
Capabilities
- use one Drupal installation for many sites
- share content to any sites during installation
- permit accesses for:
- domain
- blocks, entity types or node bundles
- domain languages
- users and user roles
Domains
Possible issues:
- SEO issues
- Single Point of Failure
- Greater configuration overhead
- Higher server load
Domain access vs Multi-site:
Multi-site
Domain Access
Domains
Installing module. You should know:
- simple server configurations
<VirtualHost *:80>
DocumentRoot /path/to/drupal/install
ServerName drupal8.test
ServerAlias *.drupal8.test drupal8.test
</VirtualHost>
- how to manage virtual hosts
sudo nano /etc/hosts
127.0.0.1 domain1.drupal8.test
127.0.0.1 domain2.drupal8.test
127.0.0.1 domain3.drupal8.test
127.0.0.1 another-domain.test
Domains
Installing on shared hosting with Cpanel:
Domains
Installing module:
- place module into /path_to_drupal/modules/contrib/ or install in via Drush or Composer
- no need to edit settings.php as in Drupal 7
- change 'cookie_domain' at sites/default/services.yml for cross-domain login
- set trusted host settings, if using:
$settings['trusted_host_patterns'] = array(
'^*\.drupal8\.test$',
'^another-domain\.test$',
);
Domains
View permissions:
Domains
Provided blocks:
Domains
Manage domains in BO:
Domains
Set domain for Entity:
Domains
Available hooks:
/**
* Notifies other modules that we are loading a domain record from the database.
*
* When using this hook, you should invoke the namespace with:
*
* use Drupal\domain\DomainInterface;
*
* @param array $domains
* An array of $domain record objects.
*/
function hook_domain_load(array $domains) {
// Add a variable to the $domain.
foreach ($domains as $domain) {
$domain->addProperty('myvar', 'mydomainvar');
}
}
/**
* Allows modules to modify the inbound domain request.
*
* When using this hook, first check $domain->getMatchType(), which returns a
* numeric constant indicating the type of match derived by the caller or by
* earlier returns of this hook (such as domain_alias_request_alter()).
* Use this value to determine if the request needs to be overridden. Valid
* types are DomainNegotiator::DOMAIN_MATCH_NONE,
* DomainNegotiator::DOMAIN_MATCH_EXACT, DomainNegotiator::DOMAIN_MATCH_ALIAS.
*/
function hook_domain_request_alter(\Drupal\domain\DomainInterface &$domain) {
// Add a special case to the example domain.
if ($domain->getMatchType() == \Drupal\domain\DomainNegotiator::DOMAIN_MATCH_EXACT && $domain->id() == 'example_com') {
// Do something here.
$domain->addProperty('foo', 'Bar');
}
}
/**
* Adds administrative operations for the domain overview form.
*
* These operations are only available to users who can administer the domain.
* That access check happens prior to this hook being called. If your use-case
* requires additional permission checking, you should provide it before
* returning any values.
*/
function hook_domain_operations(\Drupal\domain\DomainInterface $domain, \Drupal\Core\Session\AccountInterface $account) {
$operations = [];
// Check permissions.
if ($account->hasPermission('view domain aliases') || $account->hasPermission('administer domain aliases')) {
// Add aliases to the list.
$id = $domain->id();
$operations['domain_alias'] = array(
'title' => t('Aliases'),
'url' => Url::fromRoute('domain_alias.admin', array('domain' => $id)),
'weight' => 60,
);
}
return $operations;
}
/**
* Alter the list of domains that may be referenced.
*
* Note that this hook does not fire for users with the 'administer domains'
* permission.
*
*/
function hook_domain_references_alter($query, $account, $context) {
// Remove the default domain from non-admins when editing nodes.
if ($context['entity_type'] == 'node' && $context['field_type'] == 'editor' && !$account->hasPermission('edit assigned domains')) {
$default = \Drupal::service('domain.loader')->loadDefaultId();
$query->condition('id', $default, '<>');
}
}
/**
* Alter the validation step of a domain record.
*
* This hook allows modules to change or extend how domain validation
* happens. Most useful for international domains or other special cases
* where a site wants to restrict domain creation is some manner.
*
*/
function hook_domain_validate_alter(&$error_list, $hostname) {
// Only allow TLDs to be .org for our site.
if (substr($hostname, -4) != '.org') {
$error_list[] = t('Only .org domains may be registered.');
}
}
Domains
Submodules:
- domain_access
- domain_allias
- domain_config
- domain_content
- domain_source
Domains
Created modules:
- https://github.com/skilld-labs/domain config-ui branch
- https://github.com/skilld-labs/domain_language
- https://github.com/skilld-labs/domain_menu_access
- https://github.com/skilld-labs/domain_block_content
- https://github.com/skilld-labs/domain_entity
Domains
Domain Access
Questions?
usefull links
https://www.drupal.org/project/domain
https://github.com/agentrickard/domain
Vitalii Zinenko vzinenko@adyax.com
Andrey Postnikov apostnikov@gmail.com
Kharkiv Drupal Talks #4. Domain module
By Vitali Zinenko
Kharkiv Drupal Talks #4. Domain module
- 1,097