mikenz/silverstripe-simplesubsites

此包最新版本(1.0.8)的许可证信息不可用。

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

安装: 38

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 106

类型:silverstripe-module

1.0.8 2015-08-20 00:47 UTC

README

这是Silverstripe Subsites模块的一个分支。

与Subsites模块的不同之处

  • 移除了“主站”的概念 - 所有子站都是平等的
  • 兼容Silverstripe 4.0
  • 移除了“文件”中的子站选项,给人以文件只会在一个域名上可用的错觉
  • 无论选择哪个子站,主菜单项都是可用的
  • 移除了‘启用公共访问’和‘默认站点’功能。这应该在请求到达Silverstripe之前完成(例如,通过缓存/SSL终止设备或Web服务器配置)。

这应该可以替代silverstripe subsites模块,除非您进行一些数据库操作,否则您将无法访问“主站”的所有页面。

简介

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

考虑其使用的一个有用方式是,您有一个拥有全球总部和四个分布在不同国家的分支机构的业务。子站模块允许五个办事处使用单个SilverStripe安装,并将总部信息流入分支机构。分支机构可以保留个别信息,并且网站模板也可以不同。

使用此模块实现的所有内容分离都应视为装饰性的,并不适用于安全关键的应用程序。模块在CMS的“页面”和“文件”区域提供一些对访问权限的控制,但其他部分的分离要弱得多:例如,给某人“角色和访问权限”中的任何一个,都可能意味着这个人可能会将他的/她的权限提升到全局管理员角色。

有关用户文档,请参阅

  1. 设置子站
  2. 使用子站

功能 & 限制

功能

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

限制

  • 必须首先在服务器上设置每个子站域名,并且需要更新适当的DNS记录。
  • 子站不能使用与主站不同的代码库,它们本质上是相互关联的
  • 开发人员之间可以编辑的唯一代码是主题
  • 在CMS中,子站点的分离应被视为装饰性的,主要适用于CMS的“页面”和“文件”部分。
  • 所有子站点都在同一进程空间和数据集中运行。因此,如果一个子站点的故障会影响所有子站点,如果不良代码或硬件损坏了一个子站点的数据,那么它很可能已经损坏了所有子站点的数据。
    • 此原则适用于应用程序错误、安全漏洞和高流量。
  • 目前无法备份或恢复单个子站点的数据。
  • 让不同的开发团队在不同的子站点上工作可能很尴尬(但并非不可能),主要是因为所需的协作水平。更适合由同一组的开发人员负责所有子站点。

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

要求

  • 银Stripe 4.x

安装

  • 通过访问 http://<yoursite>/dev/build 创建必要的表(你应该会看到创建了“子站点”表等)。你不需要为每个子站点运行此命令。
  • 以管理员身份登录到CMS。现在你应该在主菜单上看到“子站点”条目,现在访问该部分。
  • 点击“添加子站点”按钮以创建新的子站点。
  • 创建子站点后,你会看到一个“创建子站点域名”按钮,点击该按钮输入子站点的域名或子域名。这将确定您的网站URL。例如,如果您的网站在 https:///mysite 上运行,并且将子域名设置为“subsite”,那么您的子站点将在 http://subsite.localhost/mysite 上可用。
  • 转到CMS的“页面”部分。在菜单的右上角,您将看到一个列出两个子站点的下拉菜单——“主站点”是在您安装子站点模块之前拥有的原始站点。选择您的新子站点,然后网站内容树将更改。在此阶段应该是空的。
  • 添加一个页面 - 将其标题更改为“首页”,并将其URL段更改为“home”。保存页面。
  • 更新您的DNS和(如果需要)您的Web服务器配置,以便您的子域名指向您的Web服务器上的SilverStripe安装。访问此新子域名。您应该看到新的子站点主页。

用法

严格的子域名匹配

该模块试图提供合理的默认值,其中它将 example.comwww.example.com 视为相同的域名。如果您想区分这些变体,将 Subsite::$strict_subdomain_matching 设置为TRUE。这不会影响通配符/星号检查,但消除了默认子域名的歧义。

权限

可以将组关联到一个或多个子站点,在这种情况下,授予的页面和资产相关权限仅适用于此子站点。

请注意,创建特定的子站点组并授予与之无关的权限(如内容编辑和资产管理)将导致该组的成员能够提升其权限。这里的一个例子是授予该组“完全管理权限”或某些“角色和访问权限”,在这种情况下,该组的成员可以简单地将自己添加到全局的“管理员”组或更改自己的组以访问所有网站。

应将子站点模块视为在接口级别为网站提供视觉分离的便利,而不是在同一个CMS上管理许多站点的完整紧密的安全模型(它仍然是同一个CMS)。

访问创建的域名

一旦在您的管理中创建了一些子站点/域名,您可以通过以下方式检查子站点的整体功能:

http://your.primary-domain.com/subsite-metadata-url?SubsiteID=1

在某些浏览器中,当您将鼠标悬停在子站点管理器的搜索结果中的“编辑”链接上时,SubsiteID是可见的。

在DataObjects上启用子站点支持

要使您的DataObject对子站点有意识,请在您的DataObject中包含SubsiteID。例如:

MyDataObject.php

:::php
private static $has_one = array(
    'Subsite' => 'Subsite'
);

在getCMSFields或updateCMSFields中包含当前SubsiteID作为隐藏字段。例如:

MyDataObject.php

:::php
public function getCMSFields() {
    $fields = parent::getCMSFields();
    if(class_exists('Subsite')){
        $fields->push(new HiddenField('SubsiteID','SubsiteID', Subsite::currentSubsiteID()));
    }
    return $fields;
}

为了限制您的管理网格字段仅显示当前Subsite的记录,您可以这样做:

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')){
        $list = $gridField->getList()->filter(array('SubsiteID'=>Subsite::currentSubsiteID()));
        $gridField->setList($list);
    }

    return $form;
}

启用子站点的自定义区域菜单支持

默认情况下,自定义管理区域不会显示在子站点的菜单中。并非所有管理员都适合或适用于在子站点中显示。如果您的管理员具有子站支持或故意为全局设置,您可以通过以下方式启用显示在菜单中的选项:

mysite/_config.php

:::php
MyAdmin::add_extension('SubsiteMenuExtension');

或者在您的管理员中定义subsiteCMSShowInMenu函数

MyAdmin.php

:::php
public function subsiteCMSShowInMenu(){
    return true;
}

子站点的公共显示

为确保成员的登录状态跨子域传递,您还需要配置PHP会话Cookie以对所有子域进行设置

// Example matching subsite1.example.org and www.example.org
Session::set_cookie_domain('.example.org');

屏幕截图