Php SilverStripe ModelAdmin单记录

Php SilverStripe ModelAdmin单记录,php,silverstripe,Php,Silverstripe,我最近学会了使用classModelAdmin在后端创建自定义CMS部分,并使用private static$managed_models=array('Contact')链接它们到名为联系人的数据对象 我的目标是创建一个名为“联系人”的新部分,其中包含一些联系人详细信息(电话、电子邮件等)。这些是单个字段,而不是多个记录 不幸的是,这种设置(链接到dataobject)在后端创建了一种GridField,它使用电话、电子邮件等字段创建多个“联系人”记录 如何创建包含给定字段的单个实体的自定义C

我最近学会了使用class
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
中,您可以使用类似的方法,并将其添加到“设置”选项卡中。如果希望通过左侧完全独立的选项卡控制数据,可以通过扩展来创建自定义管理面板。但是,添加几个字段需要相当多的工作。实际上,这可能正是您想要的: