【问题标题】:SilverStripe ModelAdmin single recordSilverStripe ModelAdmin 单条记录
【发布时间】:2016-04-26 13:39:44
【问题描述】:

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

我的目标是创建一个名为“联系人”的新部分,其中包含一些联系方式(电话、电子邮件等)。这些是单个字段,而不是多个记录。

不幸的是,这种设置(链接到数据对象)在后端创建了一种 GridField,它使用电话、电子邮件等字段创建多个“联系人”记录。

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

【问题讨论】:

标签: php silverstripe


【解决方案1】:

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

过滤网格字段并将其限制为一个数据记录。

你的数据对象

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

我希望这就是你要找的。​​p>

【讨论】:

  • 很棒的输入。我不熟悉getEditForm,但是设置基本上只是隐藏了网格字段?如果是这样,那将是一个有点hacky。您能否建议在不使用 ModelAdmin 的情况下实现结果的正确方法?我基本上追求的是一个与 Settings 相同但具有不同表单字段的 CMS 部分。
  • 您可以使用我给您的第二个示例,删除 GridField 并添加联系人字段。但正如你所说,这有点不合时宜。您也可以使用@3dgoo 示例。在这种情况下,我认为这将是更好的做法。这样一来,您的详细联系信息就会显示在名为“联系人”的选项卡中的“设置”中。
【解决方案2】:

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

为此,我们创建了一个 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 %>

【讨论】:

  • 效果很好!我怎么能把所有这些放在一个名为“Contact”的 new 按钮中,而不是将它们放在设置(SiteConfig)中?有没有简单的方法或者这需要大量的代码?
  • 我的建议是将其保留在“设置”面板的选项卡中。
  • 如果您真的想将数据存储在单独的 DataObject 中,您可以使用 GridFieldHasOneRelationHandler 之类的东西并将其添加到设置选项卡中。如果您希望通过左侧完全独立的选项卡控制数据,您可以通过扩展 LeftAndMain 创建自定义管理面板。但是,添加一些字段是一项相当大的工作。
  • 其实,这可能正是你所追求的:github.com/burnbright/silverstripe-hasonefield
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2017-09-30
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多