Php SilverStripe ModelAdmin单记录
我最近学会了使用classPhp SilverStripe ModelAdmin单记录,php,silverstripe,Php,Silverstripe,我最近学会了使用classModelAdmin在后端创建自定义CMS部分,并使用private static$managed_models=array('Contact')链接它们到名为联系人的数据对象 我的目标是创建一个名为“联系人”的新部分,其中包含一些联系人详细信息(电话、电子邮件等)。这些是单个字段,而不是多个记录 不幸的是,这种设置(链接到dataobject)在后端创建了一种GridField,它使用电话、电子邮件等字段创建多个“联系人”记录 如何创建包含给定字段的单个实体的自定义C
ModelAdmin
在后端创建自定义CMS部分,并使用private static$managed_models=array('Contact')链接它们
到名为联系人的数据对象
我的目标是创建一个名为“联系人”的新部分,其中包含一些联系人详细信息(电话、电子邮件等)。这些是单个字段,而不是多个记录
不幸的是,这种设置(链接到dataobject)在后端创建了一种GridField,它使用电话、电子邮件等字段创建多个“联系人”记录
如何创建包含给定字段的单个实体的自定义CMS节?这不是ModelAdmins的用途。它们用于管理您的数据对象。
尽管如此,我只能想到两种解决方案: 过滤gridfield并将其限制为一个datarecord 您的数据对象
class Contact extends DataObject
{
private static $db = [
'Name' => 'Varchar',
'Phone' => 'Varchar',
'Email' => 'Varchar'
// etc, etc
];
}
你的模型管理员
class ContactModelAdmin extends ModelAdmin
{
private static $managed_models = array(
'Contact'
);
private static $url_segment = 'contact';
private static $menu_title = 'My Contact Admin';
public function getList()
{
$list = parent::getList();
$list = $list->filter('Name', 'EagleEye')->limit(1);
return $list;
}
}
或者您可能只是想摆脱gridfield,创建一些formfields,您可以填充它们
class ContactModelAdmin extends ModelAdmin
{
private static $managed_models = array(
'Contact'
);
private static $url_segment = 'contact';
private static $menu_title = 'My Contact Admin';
public function getEditForm($id = null, $fields = null) {
$form = parent::getEditForm($id, $fields);
$gridFieldName = $this->sanitiseClassName($this->modelClass);
$form->Fields()->removeByName($gridFieldName);
$form->Fields()->push(
TextField::create('Name', 'Name', 'EagleEye')
->performReadonlyTransformation()
);
$form->Fields()->push(
TextField::create('Phone', 'Phone', '0123456789')
->performReadonlyTransformation()
);
$form->Fields()->push(
TextField::create('Email', 'Email', 'EagleEye@domain.com')
->performReadonlyTransformation()
);
return $form;
}
}
我希望这就是您想要的。我们可以使用 为此,我们创建了一个
SiteConfig
扩展,其中包含我们想要的变量和字段:
mysite/code/extensions/CustomSiteConfig.php
class CustomSiteConfig extends DataExtension {
private static $db = array(
'Phone' => 'Varchar(255)',
'Email' => 'Varchar(255)',
'Address' => 'Varchar(255)'
);
public function updateCMSFields(FieldList $fields) {
$fields->addFieldToTab('Root.Contact', TextField::create('Phone'));
$fields->addFieldToTab('Root.Contact', TextField::create('Email'));
$fields->addFieldToTab('Root.Contact', TextField::create('Address'));
}
}
我们激活扩展:
mysite/_config/config.yml
SiteConfig:
extensions:
- CustomSiteConfig
现在,我们可以使用任何模板中的变量:
<% if $SiteConfig.Phone %>$SiteConfig.Phone<% end_if %>
<% if $SiteConfig.Email %>$SiteConfig.Email<% end_if %>
<% if $SiteConfig.Address %>$SiteConfig.Address<% end_if %>
$SiteConfig.Phone
$SiteConfig.Email
$SiteConfig.Address
您可以使用诸如canCreate之类的权限阻止进一步DO的创建,但也可以将其添加到SiteConfig Great input的选项卡中。我不熟悉getEditForm,但安装程序基本上只是隐藏gridfield吗?如果是这样的话,那就有点骇人听闻了。您是否可以建议在不使用ModelAdmin的情况下实现结果的正确方法?我基本上想要的是一个CMS部分,它与设置相同,但具有不同的表单字段。您可以使用我给您的第二个示例,删除GridField并添加contactfields。但正如你所说,这是一个有点黑客的方式。您还可以使用@3dgoo示例。我想在这种情况下练习会更好。这样,您的联系人详细信息将显示在名为“联系人”选项卡的“设置”中。这非常有效!我怎么能把所有这些都放在一个名为“联系人”的新按钮中,而不是放在设置(SiteConfig)中?有没有一种简单的方法,或者这需要大量的代码?我的建议是将其保留在“设置”面板的选项卡中。如果您确实想将数据存储在单独的DataObject
中,您可以使用类似的方法,并将其添加到“设置”选项卡中。如果希望通过左侧完全独立的选项卡控制数据,可以通过扩展来创建自定义管理面板。但是,添加几个字段需要相当多的工作。实际上,这可能正是您想要的: