The subsites module provides a convenient way of running multiple websites from a single installation of SilverStripe,
sharing users, content, and assets between them - the sites will be managed from a single CMS.
A useful way to think of its use is where you have a business with a global headquarters and four branches in various
countries. The subsites module allows the five offices to use a single SilverStripe installation, and have information
from the headquarters flow down into the branches. The branches can hold information that is individual and the website
templates can also be different.
For user documentation please see:
If more isolation of code, security, or performance is needed, then consider running multiple separate installations (e.g. on separate servers).
http://<yoursite>/dev/build
(you should see a Subsite
table created, among other things). You don't need to run this command for every subsite.http://localhost/mysite
, and you set the subdomain to "subsite", then your subsite will be accessible on http://subsite.localhost/mysite
The module tries to provide sensible defaults, in which it regards example.com
and www.example.com
as the same domains. In case you want to distinguish between these variations, set Subsite::$strict_subdomain_matching
to TRUE. This won't affect wildcard/asterisk checks, but removes the ambiguity about default subdomains.
Groups can be associated with one or more subsites, in which case the granted page- and asset-related permissions
only apply to this subsite.
Note that creating a Subsite-specific group, and giving it permissions unrelated to content editing and asset management
will result in members of this group being able to escalate their privileges. An example here is giving that group
"Full administrative rights" or some of the "Roles and access permissions", in which case it is possible for the member
of that group to simply add himself to the global "Administrators" group or change his own group to having access to all
sites.
The subsites module should be viewed as providing a convenience of visual separation for the sites on the interface
level, rather than a fully tight security model for managing many sites on the same CMS (it is still the same CMS).
Once you have created some subsites/domains in your admin, you can check the overall functionality of subsites by
http://your.primary-domain.com/subsite-metadata-url?SubsiteID=1
In some Browsers the SubsiteID is visible if you hover over the "Edit" link in the search results of Subsite admin.
Download a second theme from http://www.silverstripe.com/themes/ and put it in your themes folder. Open
admin/subsites?flush=1 and select one of your subsites from the menu on the bottom-left. You should see a
Theme dropdown in the subsite details, and it should list both your original theme and the new theme. Select the new
theme in the dropdown. Now, this subsite will use a different theme from the main site.
In SilverStripe 4 themes will resolve theme files by looking through a list of themes (see the documentation on
creating your own theme).
Subsites will inherit this configuration for the order of themes. Choosing a theme for a Subsite will set the list of
themes to that chosen theme, and all themes that are defined below the chosen theme in priority. For example, with a
theme configuration as follows:
SilverStripe\View\SSViewer:
themes:
- '$public'
- 'my-theme'
- 'watea'
- 'starter'
- '$default'
Choosing watea
in your Subsite will create a cascading config as follows:
themes:
- 'watea'
- '$public'
- 'starter'
- '$default'
You may also completely define your own cascading theme lists for CMS users to choose as theme options for their
subsite:
SilverStripe\Subsites\Service\ThemeResolver:
theme_options:
normal:
- '$public'
- 'watea'
- 'starter'
- '$default'
special:
- 'my-theme'
- 'starter'
- '$default'
Not all themes might be suitable or adapted for all subsites. You can optionally limit usage of themes:
mysite/_config.php
:::php
Subsite::set_allowed_themes(array('blackcandy','mytheme'));
To make your DataObject subsite aware, include a SubsiteID on your DataObject. eg:
MyDataObject.php
:::php
private static $has_one = array(
'Subsite' => 'Subsite'
);
Include the current SubsiteID as a hidden field on getCMSFields, or updateCMSFields. eg:
MyDataObject.php
:::php
public function getCMSFields() {
$fields = parent::getCMSFields();
if(class_exists(Subsite::class)){
$fields->push(new HiddenField('SubsiteID','SubsiteID', SubsiteState::singleton()->getSubsiteId()));
}
return $fields;
}
To limit your admin gridfields to the current Subsite records, you can do something like this:
MyAdmin.php
:::php
public function getEditForm($id = null, $fields = null){
$form = parent::getEditForm($id, $fields);
$gridField = $form->Fields()->fieldByName($this->sanitiseClassName($this->modelClass));
if(class_exists(Subsite::class)){
$list = $gridField->getList()->filter(['SubsiteID'=>SubsiteState::singleton()->getSubsiteId()]);
$gridField->setList($list);
}
return $form;
}
Custom admin areas, by default, will not show in the menu of a subsite. Not all admins are adapted for or appropriate to show within a subsite. If your admin does have subsite support, or is intentionally global, you can enable the show in menu option either by applying:
mysite/_config.php
:::php
MyAdmin::add_extension('SubsiteMenuExtension');
or by defining the subsiteCMSShowInMenu function in your admin:
MyAdmin.php
:::php
public function subsiteCMSShowInMenu(){
return true;
}
By default, each subsite is available to the public (= not logged-in),
provided a correct host mapping is set up. A subsite can be marked as non-public
in its settings, in which case it only shows if a user with CMS permissions is logged in.
This is useful to create and check subsites on a live system before publishing them.
Please note that you need to filter for this manually in your own queries:
$publicSubsites = DataObject::get(
'Subsite',
Subsite::$check_is_public ? '"IsPublic"=1' : '';
);
To ensure the logged-in status of a member is carried across to subdomains,
you also need to configure PHP session cookies to be set
for all subdomains:
// Example matching subsite1.example.org and www.example.org
Session::set_cookie_domain('.example.org');
Module rating system helping users find modules that are well supported. For more on how the rating system works visit Module standards
Score not correct? Let us know there is a problem