通过数据扩展Silverstripe3添加选项卡

通过数据扩展Silverstripe3添加选项卡,silverstripe,Silverstripe,我想知道是否可以通过DataExtension添加选项卡?传递给updateCMSFields的FieldList参数显示为在“详细信息”选项卡上输出DataExtensions新字段。所以我的第一次尝试是把我的领域推到那里: public function updateCMSFields(FieldList $fields) { $secureFilesTab = $fields; $secureFilesTab->push(new HeaderField(_t('

我想知道是否可以通过DataExtension添加选项卡?传递给updateCMSFields的FieldList参数显示为在“详细信息”选项卡上输出DataExtensions新字段。所以我的第一次尝试是把我的领域推到那里:

public function updateCMSFields(FieldList $fields)  {  
    $secureFilesTab = $fields;
    $secureFilesTab->push(new HeaderField(_t('SecureFiles.GROUPACCESSTITLE', 'Group Access')));
    $secureFilesTab->push(new TreeMultiselectField('GroupPermissions', _t('SecureFiles.GROUPACCESSFIELD', 'Group Access Permissions')));
}    
这很好,但是当我保存一个值时,CMS将数据从树视图和列表视图选项卡加载到详细信息选项卡上。下面的评论中提到的事实是,这是文件夹的数据扩展

然后,我尝试使用FormScaffolder中的代码添加一个新选项卡:

public function UpdateCMSFields(FieldList $fields) {
    $fields->push(new TabSet('Root', $secureFilesTab = new Tab('Security')));
$secureFilesTab->setTitle(_t('SiteTree.TABSECURITY', 'Security'));
}
这会将所有选项卡图标更改为树视图图标,并将我的新数据扩展字段放置在所有选项卡上

通过DataExtension添加选项卡的正确方法是什么?

您可以使用addFieldsToTab()向现有选项卡或新选项卡添加新字段,就像在DataObjects上使用getCMSFields()时一样

public function updateCMSFields(FieldList $fields)  {  
    if ($this->owner->ClassName != 'Folder' ){
        $fields->addFieldsToTab('Root.Security', array(
            new HeaderField(_t('SecureFiles.GROUPACCESSTITLE', 'Group Access')),
            new TreeMultiselectField('GroupPermissions', _t('SecureFiles.GROUPACCESSFIELD', 'Group Access Permissions'))
        ));     
    }
    if ($this->owner->ClassName == 'Folder' ){
        $fields->push(new HeaderField(_t('IMAFOLDER', 'I am a folder')));       
    }
}  
如果找不到安全选项卡,将通过传递“Root.Security”作为第一个参数来创建。点表示法用于创建选项卡集和选项卡的嵌套结构。不可能简单地推送具有相同名称(“根”)的新选项卡集,因为已经存在这样的选项卡集。如果需要对选项卡进行进一步操作,可以使用$fields->findOrMakeTab('TabSet.Tab')访问它们的实例,即$fields->findOrMakeTab('Root.Content')

您可以使用addFieldsToTab()向现有选项卡或新选项卡添加新字段,就像在DataObjects上使用getCMSFields()时一样

public function updateCMSFields(FieldList $fields)  {  
    if ($this->owner->ClassName != 'Folder' ){
        $fields->addFieldsToTab('Root.Security', array(
            new HeaderField(_t('SecureFiles.GROUPACCESSTITLE', 'Group Access')),
            new TreeMultiselectField('GroupPermissions', _t('SecureFiles.GROUPACCESSFIELD', 'Group Access Permissions'))
        ));     
    }
    if ($this->owner->ClassName == 'Folder' ){
        $fields->push(new HeaderField(_t('IMAFOLDER', 'I am a folder')));       
    }
}  

如果找不到安全选项卡,将通过传递“Root.Security”作为第一个参数来创建。点表示法用于创建选项卡集和选项卡的嵌套结构。不可能简单地推送具有相同名称(“根”)的新选项卡集,因为已经存在这样的选项卡集。如果需要对选项卡进行进一步操作,可以使用$fields->findOrMakeTab('TabSet.Tab')访问它们的实例,即$fields->findOrMakeTab('Root.Content')

我在启用成员扩展中的选项卡时也遇到了问题

public function updateCMSFields(FieldList $fields)
最后,在我删除字段后,它开始工作

$fields->changeFieldOrder($order);

试试看,也许对你有帮助

我在启用成员扩展中的选项卡时也遇到了问题

public function updateCMSFields(FieldList $fields)
最后,在我删除字段后,它开始工作

$fields->changeFieldOrder($order);

试试看,也许对你有帮助

我已经编辑了答案:代码中有一个输入错误(addFieldsToTab而不是addFieldsToTabs),感谢您花时间回复。当我将Root.Security传递给addFieldsToTab时,我得到了以下错误:framework/forms/FieldList.php第295行出错:FieldList::addFieldToTab()试图将选项卡添加到对象“FieldList”-“Root”不存在。有什么想法吗?我在两个装饰器上尝试了上面的代码片段:一个用于页面,另一个用于成员,在这两种情况下,我都可以看到一个名为security的新选项卡,其中包含预期的字段。也许你能给我们多一点背景知识?比如你在装饰什么?修饰后的数据对象是否依赖于脚手架来构建其字段集(或者在添加更多字段定义之前执行父::getCMSFields()?似乎主选项卡集根不是以某种方式构建的,所以上游的某些东西可能不正确?抱歉,缺少上下文。我正在扩展文件/文件夹,因此我正在AssetAdmin中工作。当我执行var_dump($fields->first())时,我会收到扩展文件夹CMS页面的DetailsView选项卡上显示的name字段。因此,本例中的$fields参数似乎是在DetailsView选项卡中找到的FieldList?尝试使用公共函数updateCMSFields(FieldList$fields){if($this->owner->ClassName!=“Folder”){$fields->addFieldsToTab('Root.Security',array(new HeaderField)(\u t('SecureFiles.GROUPACCESSTITLE','Group Access')),新树多选择字段('GroupPermissions','u t('SecureFiles.GROUPACCESSFIELD','Group accesspermissions'));}这对我来说适用于文件。这是一个开始。我不确定你是否也适用于文件夹?我已经编辑了答案:代码中有一个输入错误(addFieldsToTab而不是addFieldsToTabs)感谢您花时间回复。当我将Root.Security传递给addFieldsToTab时,我得到以下错误:framework/forms/FieldList.php第295行的错误:FieldList::addFieldToTab()尝试将选项卡添加到对象“FieldList”-“Root”不存在。有什么想法吗?我在两个装饰器上尝试了上面的代码片段:一个用于页面,另一个用于成员,在这两种情况下,我都可以看到一个名为security的新选项卡,带有预期的字段。也许你可以给我们更多的上下文?比如你在装饰什么?装饰的DataObject依赖脚手架来构建其字段集(或在添加更多字段定义之前执行parent::getCMSFields())?似乎主选项卡集根不是以某种方式构建的,因此上游可能有问题?很抱歉缺少上下文。我正在扩展文件/文件夹,所以我在AssetAdmin中工作。当我执行var\u转储时($fields->first())我收到了扩展文件夹CMS页面的DetailsView选项卡上的name字段。因此,本例中的$fields参数似乎是DetailsView选项卡中的FieldList?尝试使用公共函数updateCMSFields(FieldList$fields){if($this->owner->ClassName!=“Folder”){$fields->addFieldsToTab('Root.Security',array(新的HeaderField('SecureFiles.GROUPACCESSTITLE','Group Access')),新的TreeMultiselectField('GroupPermissions','u t('SecureFiles.GROUPACCESSFIELD','Group accesspermissions'));}这对我来说适用于文件。这是一个开始。我不确定你是否希望这也适用于文件夹?这已经发生在我身上两次了。谢谢你的回答它启动了我的记忆。这已经发生在我身上两次了。谢谢你的回答它启动了我的记忆。