Silverstripe多子站下LinkField页面下拉如何按子站筛选?
Silverstripe LinkField 按子站筛选页面的解决思路
利用树形菜单的过滤回调限定站点
在LinkField配置中,通过setTreeConfig传入过滤逻辑,基于当前子站ID筛选页面:$linkField = LinkField::create('BannerLink', 'Banner Link') ->setTreeConfig([ 'filter' => function ($tree) { $currentSite = Site::current_site(); return $tree->filter('SiteID', $currentSite->ID); } ]);该方法直接给树形组件添加站点ID过滤规则,只展示当前子站下的页面。
指定子站根节点缩小树形范围
如果过滤回调不生效,可直接将树形菜单的根节点设为当前子站的首页,避免加载其他站点页面:$currentSite = Site::current_site(); $linkField = LinkField::create('BannerLink', 'Banner Link') ->setConfig('tree_base_id', $currentSite->Root()->ID);这种方式从子站根页面开始渲染树形结构,天然屏蔽其他站点内容。
全局扩展实现批量过滤
若所有LinkField都需要站点过滤,可通过扩展类全局配置:- 创建扩展类:
class SiteFilteredLinkFieldExtension extends Extension { public function updateTreeConfig(&$config) { $currentSite = Site::current_site(); if ($currentSite) { $config['filter'] = function ($tree) use ($currentSite) { return $tree->filter('SiteID', $currentSite->ID); }; } } }- 在
config.yml注册扩展:
SilverStripe\Forms\LinkField: extensions: - SiteFilteredLinkFieldExtension排查管理员权限影响
超级管理员默认会看到所有站点页面,即使配置了过滤。这种情况需强制保留过滤逻辑,不受用户权限影响,确保后台展示的页面严格归属当前子站。
内容的提问来源于stack exchange,提问作者galilee
相关产品推荐
相关产品推荐

