silverstripe / subsites
从单个SilverStripe安装运行多个网站。
Requires
- php: ^8.1
- silverstripe/admin: ^2
- silverstripe/asset-admin: ^2
- silverstripe/cms: ^5
- silverstripe/errorpage: ^2
- silverstripe/framework: ^5
- silverstripe/versioned: ^2
Requires (Dev)
- 4.x-dev
- 3.x-dev
- 3.3.x-dev
- 3.3.0-beta1
- 3.2.x-dev
- 3.2.4
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- 3.2.0-rc1
- 3.2.0-beta1
- 3.1.x-dev
- 3.1.2
- 3.1.1
- 3.1.0
- 3.1.0-rc1
- 3.1.0-beta1
- 3.0.x-dev
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 3.0.0-rc1
- 3.0.0-beta1
- 2.x-dev
- 2.8.x-dev
- 2.8.7
- 2.8.6
- 2.8.5
- 2.8.4
- 2.8.3
- 2.8.2
- 2.8.1
- 2.8.0
- 2.8.0-rc1
- 2.8.0-beta1
- 2.7.x-dev
- 2.7.0
- 2.7.0-rc1
- 2.7.0-beta1
- 2.6.x-dev
- 2.6.1
- 2.6.0
- 2.5.x-dev
- 2.5.0
- 2.4.x-dev
- 2.4.1
- 2.4.0
- 2.3.x-dev
- 2.3.3
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.x-dev
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.x-dev
- 2.1.1
- 2.1.0
- 2.0.x-dev
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-beta1
- 1.x-dev
- 1.5.x-dev
- 1.4.x-dev
- 1.4.2
- 1.4.1
- 1.4.0
- 1.3.x-dev
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.x-dev
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.x-dev
- 1.1.0
- 1.0.x-dev
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.1-rc1
- 0.6.x-dev
- 0.5.x-dev
- 0.4.x-dev
- 0.3.x-dev
- 0.3.4
- 0.3.1
- 0.3.0
- 0.2.8
- 0.2.7
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.3
- 0.2.2
- dev-master
This package is auto-updated.
Last update: 2024-09-21 12:03:48 UTC
README
安装
composer require silverstripe/subsites
简介
subsites模块提供了一种方便的方法,可以从单个SilverStripe安装运行多个网站,在它们之间共享用户、内容和资产 - 网站将由单个CMS管理。
可以这样理解它的用途:假设您有一家拥有全球总部和遍布各个国家的四个分公司的企业。subsites模块允许五个办公室使用单个Silverstripe安装,并将总部的信息传递到各个分公司。分公司可以保存个性化的信息,并且网站模板也可以不同。
使用此模块实现的所有内容分离应被视为外观上的,不适用于安全关键型应用。模块在CMS的“页面”和“文件”区域中提供一些对访问权限的控制,但其他部分的分离要弱得多:例如,授予某人“角色和访问权限”中的任何一项,都意味着此人很可能将其权限提升到全局管理员角色。有关用户文档,请参阅
功能与限制
功能
- 从用户的角度来看,每个子站都像一个独立的网站
- 无需复制现有代码,因为所有子站都使用与主站相同的代码库
- 可以为每个子站域名设置单独的权限
- 可以从主站复制页面及其内容到子站
- 创建子站页面的翻译
- 安排子站页面的发布
- 数据库在子站之间是共享的(这意味着复制内容很容易)
- 在灾难恢复时,启动一个包含100个子站的单个环境副本比启动100个环境要容易得多。
限制
- 子站通常通过其自己的独立域名访问。为了允许高效的跨子站CMS编辑,它们也可以通过URL参数而不是域名映射来访问。这可能会削弱您环境中针对特定域的安全控制,例如特定域的IP白名单、防火墙规则或业务逻辑。
- 必须在服务器上首先设置每个子站域名,并且需要根据需要更新DNS记录。
- 子站不能使用与主站不同的代码库,它们本质上是相互关联的
- 然而,在创建子站时可以删除子站中的页面类型 - 有关更多详细信息,请参阅设置文档
- 开发人员可以在子站之间编辑的唯一代码是主题
- CMS中子站的分离应被视为外观上的,主要适用于CMS的“页面”和“文件”部分。
- 所有子站都在同一进程空间和数据集中运行。因此,如果一个子站出现问题,会影响所有子站;如果坏代码或硬件损坏了一个子站的数据,它很可能已经损坏了所有子站的数据。
- 此原则适用于应用程序错误、安全漏洞和高流量水平
- 目前无法从单个子站备份或恢复数据。
- 让不同团队的开发者在不同子站上工作可能很困难(但并非不可能),主要是因为所需的协作水平。更适合同一个开发团队负责所有子站。
如果需要更多的代码隔离、安全性或性能,请考虑运行多个独立的安装(例如,在单独的服务器上)。
使用方法
严格子域名匹配
模块尝试提供合理的默认值,其中将其视为example.com
和www.example.com
是相同的域名。如果您想区分这些变体,将Subsite::$strict_subdomain_matching
设置为TRUE。这不会影响通配符/星号检查,但消除了默认子域的不确定性。
权限
可以将组关联到一个或多个子站点,在这种情况下,授予的页面和资产相关权限仅适用于此子站点。
请注意,创建特定于子站点的组,并授予与内容编辑和资产管理无关的权限,将导致该组成员能够提升其权限。例如,授予该组“完全管理权限”或“角色和访问权限”中的某些权限,在这种情况下,该组成员只需将自己添加到全局的“管理员”组或更改自己的组以访问所有网站。
子站点模块应被视为在界面级别为网站提供视觉分离的便利,而不是在同一CMS上管理许多网站的全安全模型(它仍然是同一个CMS)。
访问创建的域名
一旦您在管理员中创建了一些子站点/域名,您可以通过以下方式检查子站点的整体功能
http://your.primary-domain.com/subsite-metadata-url?SubsiteID=1
在某些浏览器中,如果将鼠标悬停在子站点管理员搜索结果中的“编辑”链接上,则子站点ID是可见的。
子站点特定主题
从http://www.silverstripe.com/themes/下载第二个主题并将其放入您的主题文件夹中。打开admin/subsites?flush=1并从左下角的菜单中选择您的子站点之一。您应该在子站点详细信息中看到一个主题下拉菜单,并且它应该列出您原始的主题和新主题。在下拉菜单中选择新主题。现在,此子站点将使用与主站不同的主题。
级联主题
主题将通过查看主题列表来解析主题文件(请参阅有关创建自己的主题的文档)。子站点将继承此配置以确定主题的顺序。为子站点选择一个主题将设置主题列表为所选主题,以及所有优先级低于所选主题的主题。例如,如果主题配置如下
SilverStripe\View\SSViewer: themes: - '$public' - 'my-theme' - 'watea' - 'starter' - '$default'
在您的子站点中选择watea
将创建以下级联配置
themes: - 'watea' - '$public' - 'starter' - '$default'
您还可以为CMS用户完全定义自己的级联主题列表,以便作为子站点主题选项进行选择
SilverStripe\Subsites\Service\ThemeResolver: theme_options: normal: - '$public' - 'watea' - 'starter' - '$default' special: - 'my-theme' - 'starter' - '$default'
限制子站点的可用主题
并非所有主题都适合或适用于所有子站点。您可以选择限制主题的使用
mysite/_config.php
Subsite::set_allowed_themes(array('blackcandy','mytheme'));
在DataObjects上启用子站点支持
要使您的DataObject具有子站点感知性,请在您的DataObject上包含一个SubsiteID。例如
MyDataObject.php
private static $has_one = [ 'Subsite' => Subsite::class ];
在getCMSFields或updateCMSFields中将当前SubsiteID作为隐藏字段包含,例如
MyDataObject.php
public function getCMSFields() { $fields = parent::getCMSFields(); if (class_exists(Subsite::class)){ $fields->push(HiddenField::create('SubsiteID', 'SubsiteID', SubsiteState::singleton()->getSubsiteId())); } return $fields; }
要限制您的admin gridfields仅限于当前子站点的记录,您可以这样做
MyAdmin.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; }
在子站点中启用自定义区域的菜单支持
默认情况下,自定义管理区域不会显示在子站点的菜单中。并非所有管理员都适合或适合在子站点内显示。如果您的管理员具有子站点支持或故意全局,您可以通过以下方式启用显示在菜单中的选项
mysite/_config.php
MyAdmin::add_extension('SubsiteMenuExtension');
或者通过在您的管理员中定义subsiteCMSShowInMenu函数
MyAdmin.php
public function subsiteCMSShowInMenu(){ return true; }
与Fluent结合使用子站点
当与Fluent模块结合使用时,Subsites模块将i18n区域设置为当前子站点中定义的语言。如果不需要这种行为并且需要在FluentState中使用区域,请在其yml配置文件中使用以下设置
SilverStripe\Subsites\Extensions\SiteTreeSubsites: ignore_subsite_locale: true
子站点的公共显示
默认情况下,每个子站点对公众(=未登录用户)都是可用的,前提是已设置正确的主机映射。可以在子站点的设置中将其标记为非公开,此时只有当具有CMS权限的用户登录时才显示。这在发布之前在实时系统上创建和检查子站点很有用。
请注意,您需要在自己的查询中手动进行过滤
$publicSubsites = DataObject::get( 'Subsite', Subsite::$check_is_public ? '"IsPublic"=1' : ''; );
为了确保成员的登录状态能够跨子域传递,您还需要配置PHP会话cookie,以便为所有子域设置
// Example matching subsite1.example.org and www.example.org Session::set_cookie_domain('.example.org');