SilverStripe ModelAdmin单条记录

时间:2016-04-26 13:39:45

标签: php silverstripe

我最近学会了使用类ModelAdmin在后​​端创建自定义CMS部分,并使用private static $managed_models = array('Contact');将它们链接到名为Contact的DataObject。

我的目标是创建一个名为" Contact"其中包含一些联系方式(电话,电子邮件等)。这些是单数字段,而不是多个记录。

不幸的是,这个设置(链接到dataobject)在后端创建了一种GridField,它创建了多个" Contact"电话,电子邮件等字段的记录。

如何创建包含指定字段的单一实体的自定义CMS部分?

2 个答案:

答案 0 :(得分:3)

这不是ModelAdmins的用途。它们旨在管理您的数据对象。
也就是说,我只能想到两个解决方案:

过滤网格域并将其限制为一个数据线。

您的数据对象

class Contact extends DataObject
{
    private static $db = [
        'Name' => 'Varchar',
        'Phone' => 'Varchar',
        'Email' => 'Varchar'
        // etc, etc
    ];
}

您的ModelAdmin

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;
    }
}

我希望这就是你要找的东西。

答案 1 :(得分:2)

我们可以使用SiteConfig extension将这些变量存储在网站设置中,而不是添加单个Client DataObject

为此,我们使用我们想要的变量和字段创建SiteConfig扩展名:

<强> mysite的/代码/扩展/ 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 %>