silverstripe/subsites

从单个SilverStripe安装运行多个网站。

安装次数: 316 065

依赖者: 21

建议者: 1

安全性: 2

星标: 65

关注者: 22

分支: 106

开放性问题: 45

类型:silverstripe-vendormodule


README

CI Silverstripe supported module

安装

composer require silverstripe/subsites

简介

subsites模块提供了一种方便的方法,可以从单个SilverStripe安装运行多个网站,在它们之间共享用户、内容和资产 - 网站将由单个CMS管理。

可以这样理解它的用途:假设您有一家拥有全球总部和遍布各个国家的四个分公司的企业。subsites模块允许五个办公室使用单个Silverstripe安装,并将总部的信息传递到各个分公司。分公司可以保存个性化的信息,并且网站模板也可以不同。

使用此模块实现的所有内容分离应被视为外观上的,不适用于安全关键型应用。模块在CMS的“页面”和“文件”区域中提供一些对访问权限的控制,但其他部分的分离要弱得多:例如,授予某人“角色和访问权限”中的任何一项,都意味着此人很可能将其权限提升到全局管理员角色。

有关用户文档,请参阅

  1. 设置subsites
  2. 与subsites协作

功能与限制

功能

  • 从用户的角度来看,每个子站都像一个独立的网站
  • 无需复制现有代码,因为所有子站都使用与主站相同的代码库
  • 可以为每个子站域名设置单独的权限
  • 可以从主站复制页面及其内容到子站
  • 创建子站页面的翻译
  • 安排子站页面的发布
  • 数据库在子站之间是共享的(这意味着复制内容很容易)
  • 在灾难恢复时,启动一个包含100个子站的单个环境副本比启动100个环境要容易得多。

限制

  • 子站通常通过其自己的独立域名访问。为了允许高效的跨子站CMS编辑,它们也可以通过URL参数而不是域名映射来访问。这可能会削弱您环境中针对特定域的安全控制,例如特定域的IP白名单、防火墙规则或业务逻辑。
  • 必须在服务器上首先设置每个子站域名,并且需要根据需要更新DNS记录。
  • 子站不能使用与主站不同的代码库,它们本质上是相互关联的
  • 开发人员可以在子站之间编辑的唯一代码是主题
  • CMS中子站的分离应被视为外观上的,主要适用于CMS的“页面”和“文件”部分。
  • 所有子站都在同一进程空间和数据集中运行。因此,如果一个子站出现问题,会影响所有子站;如果坏代码或硬件损坏了一个子站的数据,它很可能已经损坏了所有子站的数据。
    • 此原则适用于应用程序错误、安全漏洞和高流量水平
  • 目前无法从单个子站备份或恢复数据。
  • 让不同团队的开发者在不同子站上工作可能很困难(但并非不可能),主要是因为所需的协作水平。更适合同一个开发团队负责所有子站。

如果需要更多的代码隔离、安全性或性能,请考虑运行多个独立的安装(例如,在单独的服务器上)。

使用方法

严格子域名匹配

模块尝试提供合理的默认值,其中将其视为example.comwww.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');

截图