如何在特定Subsite中排除Silverstripe Elemental区块或指定允许元素?
Silverstripe Elemental 按Subsite控制区块权限
完全可以针对特定Subsite排除Elemental区块,也能按Subsite单独指定允许使用的区块,支持通过配置文件、自定义函数/扩展来实现,具体方法如下:
一、通过配置文件实现
Silverstripe的配置系统支持按Subsite上下文覆盖配置,你可以针对不同Subsite设置允许的区块列表:
- 先在全局
config.yml定义基础允许的区块:
Page: extensions: - DNADesign\Elemental\Extensions\ElementalPageExtension DNADesign\Elemental\Models\ElementArea: allowed_elements: - DNADesign\Elemental\Models\ElementContent - DNADesign\Elemental\Models\ElementImage
- 为特定Subsite单独配置(比如Subsite ID为2的站点,只允许文本区块):
--- Name: subsite2-elemental-config After: elemental/* Only: subsites: - 2 --- DNADesign\Elemental\Models\ElementArea: allowed_elements: - DNADesign\Elemental\Models\ElementContent
如果需要排除特定区块,可使用disallowed_elements配置(需Elemental版本支持):
--- Name: subsite3-elemental-config After: elemental/* Only: subsites: - 3 --- DNADesign\Elemental\Models\ElementArea: disallowed_elements: - DNADesign\Elemental\Models\ElementImage
二、通过自定义扩展/函数实现
如果需要更灵活的动态逻辑(比如根据Subsite属性判断),可以写一个DataExtension扩展ElementArea:
- 创建扩展文件
app/src/Extensions/SubsiteElementalControlExtension.php:
<?php namespace App\Extensions; use DNADesign\Elemental\Models\ElementArea; use SilverStripe\Core\Extension; use SilverStripe\Subsites\Model\Subsite; class SubsiteElementalControlExtension extends Extension { public function updateAllowedElements(&$allowed) { $currentSubsite = Subsite::currentSubsite(); if (!$currentSubsite) { return; } // 根据Subsite ID或属性动态过滤 switch ($currentSubsite->ID) { case 4: $allowed = [ DNADesign\Elemental\Models\ElementContent::class, DNADesign\Elemental\Models\ElementVideo::class, ]; break; case 5: // 移除地图区块 $mapKey = array_search(DNADesign\Elemental\Models\ElementMap::class, $allowed); if ($mapKey !== false) { unset($allowed[$mapKey]); } break; } } }
- 在
config.yml注册扩展:
DNADesign\Elemental\Models\ElementArea: extensions: - App\Extensions\SubsiteElementalControlExtension
三、注意事项
- 确保Subsites模块与Elemental模块版本兼容,旧版本可能不支持
Only: subsites配置语法,需升级到较新版本。 - 若使用自定义Page类型,可直接在对应Page类型的配置中按Subsite覆盖
allowed_elements,逻辑与上述一致。
内容的提问来源于stack exchange,提问作者galilee
相关产品推荐
相关产品推荐

