SilverStripe ModelAdmin 单条记录
SilverStripe ModelAdmin single record
我最近学会了使用 class ModelAdmin
在后端创建自定义 CMS 部分,并使用 private static $managed_models = array('Contact');
将它们链接到名为 Contact
的数据对象。
我的目标是创建一个名为 "Contact" 的新部分,其中包含一些联系方式(phone、电子邮件等)。这些是单个字段,而不是多个记录。
不幸的是,此设置(链接到数据对象)在后端创建了一种 GridField,它创建了多个 "Contact" 带有字段 Phone、电子邮件等的记录
如何创建包含给定字段的单个实体的自定义 CMS 部分?
这不是 ModelAdmin 的用途。它们旨在管理您的数据对象。
也就是说,我只能想到两个解决方案:
过滤网格域并将其限制为一个数据记录。
您的数据对象
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;
}
}
或者您可能只想摆脱网格域并创建一些可以填充的表单域。
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
extension.
将这些变量存储在站点设置中,而不是添加单个 Client
DataObject
为此,我们创建了一个 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 %>
我最近学会了使用 class ModelAdmin
在后端创建自定义 CMS 部分,并使用 private static $managed_models = array('Contact');
将它们链接到名为 Contact
的数据对象。
我的目标是创建一个名为 "Contact" 的新部分,其中包含一些联系方式(phone、电子邮件等)。这些是单个字段,而不是多个记录。
不幸的是,此设置(链接到数据对象)在后端创建了一种 GridField,它创建了多个 "Contact" 带有字段 Phone、电子邮件等的记录
如何创建包含给定字段的单个实体的自定义 CMS 部分?
这不是 ModelAdmin 的用途。它们旨在管理您的数据对象。
也就是说,我只能想到两个解决方案:
过滤网格域并将其限制为一个数据记录。
您的数据对象
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;
}
}
或者您可能只想摆脱网格域并创建一些可以填充的表单域。
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
extension.
Client
DataObject
为此,我们创建了一个 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 %>