2016-09-15 19 views
2

私はDataObjectを管理するためにModelAdminを拡張しており、別のDataObjectによって管理される$has_manyの関係を持っています。このオブジェクトを別のタブで管理したいのですが、どのように追加するか分かりません。私の基本的なコード:has_many関係を持つModelAdmin

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の持っている、getValidatorgetValidator()する必要があります)、そのクラスにも仕事に関係のため$has_one = ['Application' => 'Application'];を必要とします。

+0

ありがとうございました。私は 'Root.Main'の' addFieldToTab'を持っていなければ、私のフィールドがまだ現れているのが不思議です。これは、親がデフォルトのものを作成しているためですか? – Rudiger

+1

@Rudiger正確には、DataObject.phpの 'getCMSFields()'をチェックアウトして、そこから自動的にフィールドが生成されるところのトレースに従います。 '$ fields = parent :: getCMSFields();'はモジュールに 'DataObjects'のcmsフィールドをすべて変更させる拡張フックを持っているので、これを使うのが良い方法です。 –

関連する問題