mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 11:05:55 +02:00
NEW Access to non-public subsites for logged-in users
Also added caching subsite domain mapping
This commit is contained in:
parent
18bcda48d3
commit
172752a9f4
21
README.md
21
README.md
@ -101,6 +101,27 @@ Not all themes might be suitable or adapted for all subsites. You can optionally
|
|||||||
:::php
|
:::php
|
||||||
Subsite::set_allowed_themes(array('blackcandy','mytheme'));
|
Subsite::set_allowed_themes(array('blackcandy','mytheme'));
|
||||||
|
|
||||||
|
### Public display of a subsite
|
||||||
|
|
||||||
|
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');
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
![](docs/en/_images/subsites-module-adminscreenshot-new.png)
|
![](docs/en/_images/subsites-module-adminscreenshot-new.png)
|
||||||
|
@ -53,7 +53,7 @@ class LeftAndMainSubsites extends Extension {
|
|||||||
|
|
||||||
case "CMSMain":
|
case "CMSMain":
|
||||||
// If there's a default site then main site has no meaning
|
// If there's a default site then main site has no meaning
|
||||||
$showMainSite = !DataObject::get_one('Subsite',"\"DefaultSite\"=1 AND \"IsPublic\"=1");
|
$showMainSite = !DataObject::get_one('Subsite',"\"DefaultSite\"=1");
|
||||||
$subsites = Subsite::accessible_sites($accessPerm, $showMainSite);
|
$subsites = Subsite::accessible_sites($accessPerm, $showMainSite);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -76,6 +76,8 @@ class Subsite extends DataObject implements PermissionProvider {
|
|||||||
*/
|
*/
|
||||||
private static $_cache_accessible_sites = array();
|
private static $_cache_accessible_sites = array();
|
||||||
|
|
||||||
|
private static $_cache_subsite_for_domain = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array $allowed_themes Numeric array of all themes which are allowed to be selected for all subsites.
|
* @var array $allowed_themes Numeric array of all themes which are allowed to be selected for all subsites.
|
||||||
* Corresponds to subfolder names within the /themes folder. By default, all themes contained in this folder
|
* Corresponds to subfolder names within the /themes folder. By default, all themes contained in this folder
|
||||||
@ -90,6 +92,11 @@ class Subsite extends DataObject implements PermissionProvider {
|
|||||||
*/
|
*/
|
||||||
static $strict_subdomain_matching = false;
|
static $strict_subdomain_matching = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var boolean Respects the IsPublic flag when retrieving subsites
|
||||||
|
*/
|
||||||
|
static $check_is_public = true;
|
||||||
|
|
||||||
static function set_allowed_domains($domain){
|
static function set_allowed_domains($domain){
|
||||||
user_error('Subsite::set_allowed_domains() is deprecated; it is no longer necessary '
|
user_error('Subsite::set_allowed_domains() is deprecated; it is no longer necessary '
|
||||||
. 'because users can now enter any domain name', E_USER_NOTICE);
|
. 'because users can now enter any domain name', E_USER_NOTICE);
|
||||||
@ -334,15 +341,22 @@ JS;
|
|||||||
* @param $host The host to find the subsite for. If not specified, $_SERVER['HTTP_HOST'] is used.
|
* @param $host The host to find the subsite for. If not specified, $_SERVER['HTTP_HOST'] is used.
|
||||||
* @return int Subsite ID
|
* @return int Subsite ID
|
||||||
*/
|
*/
|
||||||
static function getSubsiteIDForDomain($host = null, $returnMainIfNotFound = true) {
|
static function getSubsiteIDForDomain($host = null, $checkPermissions = true) {
|
||||||
if($host == null) $host = $_SERVER['HTTP_HOST'];
|
if($host == null) $host = $_SERVER['HTTP_HOST'];
|
||||||
|
|
||||||
if(!Subsite::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);
|
|
||||||
$SQL_host = Convert::raw2sql($host);
|
|
||||||
|
|
||||||
$matchingDomains = DataObject::get("SubsiteDomain", "'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
|
if(!Subsite::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);
|
||||||
"\"IsPrimary\" DESC", "INNER JOIN \"Subsite\" ON \"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND
|
|
||||||
\"Subsite\".\"IsPublic\"=1");
|
$cacheKey = implode('_', array($host, Member::currentUserID(), Subsite::$check_is_public));
|
||||||
|
if(isset(self::$_cache_subsite_for_domain[$cacheKey])) return self::$_cache_subsite_for_domain[$cacheKey];
|
||||||
|
|
||||||
|
$SQL_host = Convert::raw2sql($host);
|
||||||
|
$joinFilter = self::$check_is_public ? "AND \"Subsite\".\"IsPublic\"=1" : '';
|
||||||
|
$matchingDomains = DataObject::get(
|
||||||
|
"SubsiteDomain",
|
||||||
|
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
|
||||||
|
"\"IsPrimary\" DESC",
|
||||||
|
"INNER JOIN \"Subsite\" ON \"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" $joinFilter"
|
||||||
|
);
|
||||||
|
|
||||||
if($matchingDomains) {
|
if($matchingDomains) {
|
||||||
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
|
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
|
||||||
@ -355,16 +369,18 @@ JS;
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $subsiteIDs[0];
|
$subsiteID = $subsiteIDs[0];
|
||||||
|
} else if($default = DataObject::get_one('Subsite', "\"DefaultSite\" = 1")) {
|
||||||
|
// Check for a 'default' subsite
|
||||||
|
$subsiteID = $default->ID;
|
||||||
|
} else {
|
||||||
|
// Default subsite id = 0, the main site
|
||||||
|
$subsiteID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for a 'default' subsite
|
self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;
|
||||||
if ($default = DataObject::get_one('Subsite', "\"DefaultSite\" = 1")) {
|
|
||||||
return $default->ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default subsite id = 0, the main site
|
return $subsiteID;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getMembersByPermission($permissionCodes = array('ADMIN')){
|
function getMembersByPermission($permissionCodes = array('ADMIN')){
|
||||||
@ -629,5 +645,6 @@ JS;
|
|||||||
*/
|
*/
|
||||||
static function on_db_reset() {
|
static function on_db_reset() {
|
||||||
self::$_cache_accessible_sites = array();
|
self::$_cache_accessible_sites = array();
|
||||||
|
self::$_cache_subsite_for_domain = array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user