2016-09-15 98 views
2

我正在延伸ModelAdmin来管理DataObject,我有$has_many的关系由另一个DataObject管理。我想在另一个选项卡上管理这个对象,但是我怎么会添加它。我的基本代码:ModelAdmin与has_many的关系

ApplicationAdmin.php:

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

    private static $url_segment = 'apps'; 

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

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

Document.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标签进入。

回答

2

您可以使用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'];

+0

谢谢。我很好奇,如果我没有为'Root.Main'添加'addFieldToTab',我的字段仍然出现。这是因为父母正在创建默认的? – Rudiger

+1

@Rudiger,您可以在DataObject.php中查看'getCMSFields()'并跟踪从那里到这些字段自动生成的地方。使用'$ fields = parent :: getCMSFields();'是一个很好的习惯,因为它有一个扩展挂钩,它允许模块修改所有'DataObjects''cms字段。 –