【问题标题】:ModelAdmin with a has_many relationship具有 has_many 关系的 ModelAdmin
【发布时间】:2017-01-23 09:13:01
【问题描述】:

我正在扩展ModelAdmin 以管理DataObject,并且我有一个由另一个DataObject 管理的$has_many 关系。我想在另一个选项卡上管理这个对象,但我不知道如何添加它。我的基本代码:

ApplicationAdmin.php:

class Applications extends ModelAdmin {
    private static $menu_title = 'Applications';

    private static $url_segment = 'apps';

    private static $managed_models = array (
        'Application'
    );
}

应用程序.php

class Application extends DataObject {
    private static $db = array(
        'Name' => "varchar"
    );

    private static $has_many = array(
        'Documents' => 'Document',
    );

    public function getCMSFields() {
        $fields = FieldList::create(
            TextField::create('Name'),
        );

        return $fields;
    }
}

文档.php

class Document extends DataObject {
    private static $db = array(
        'Title' => "varchar",
    );

    private static $has_one = array(
        "Document" => "File",
        "Application" => "Application"
    );

    public function getCMSFields () {
        $fields = FieldList::create(
            TextField::create('Title'),
            $doc = new UploadField('Document')
        );
        $doc->getValidator()->setAllowedExtensions(array('pdf', 'docx'));

        return $fields;
    }   
}

基本上,我想在Root.Documents 标签下管理此条目的文档。

【问题讨论】:

    标签: php silverstripe modeladmin


    【解决方案1】:

    您可以使用GridField 来处理ApplicationDocument 之间的关系,如果您愿意,可以将该字段放在其自己的选项卡上。示例:

    # Application.php
    public function getCMSFields() {
    
        $fields         = parent::getCMSFields();
        $nameField      = TextField::create('Name');
        $documentsField = GridField::create(
            'Documents',
            'Documents',
            $this->Documents(),
            GridFieldConfig_RelationEditor::create()
        );
    
        $fields->addFieldToTab(
            'Root.Main',
            $nameField
        );
    
        $fields->addFieldToTab(
            'Root.Documents',
            $documentsField
        );
    
        return $fields;
    
    }
    

    您的代码在 Document 类中包含一些拼写错误(类名中包含 .php,getValidator 应该是 getValidator()),并且该类还需要一个 $has_one = ['Application' => 'Application']; 才能工作。

    【讨论】:

    • 谢谢。我很好奇,如果我没有 addFieldToTabRoot.Main 我的字段仍然出现。这是因为父母正在创建默认的吗?
    • @Rudiger 确切地说,您可以在 DataObject.php 中查看getCMSFields() 并从那里跟踪到自动生成字段的位置。使用$fields = parent::getCMSFields(); 是一个好习惯,因为它有一个扩展挂钩,允许模块修改所有DataObjects' cms 字段。
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多