在 SilverStripe 中上传文件

File uploading in SilverStripe

我尝试做一个简单的字母存储:

Letter.php:

class Letter extends DataObject 
{
  private static $db = array (
    'DateUpload' => 'Date',
    'LetterNumber' => 'Text',
    'Theme' => 'Text',
    'Sender' => 'Text',
    'SendTo' => 'Text'  
  );

  private static $has_many = array (
    'LetterFiles' => 'LetterFiles'
  );

  public function getCMSFields(){
    $fields = FieldList::create (
      TextField::create('Theme','Theme'),
      DropdownField::create('Sender','Sender'),
      ...
      $uploader = UploadField::create('FileName','Attached Files')
    )
    ...
  }
}

LetterFiles.php:

class LetterFiles extends File 
{
  private static $has_one = array (
    'LetterOfFile' => 'Letter'
  );
}

LetterAdmin.php:

class LetterAdmin extends ModelAdmin 
{
  private static $managed_models = array (
    'Letter'
  );
  private static $menu_title = 'Letters';
  private static $url_segment = 'letters';
}

但是在管理界面创建新信件时我无法附加文件:我可以上传它,但是按下按钮后 "Save" 我在 "Attached Files" 中看不到它场.

您的 UploadField 应该使用您在 DataObject 上的关系。在你的情况下,那将是 'LetterFiles':

$uploader = UploadField::create('LetterFiles', 'Attached Files')

另一件小事:我强烈建议您不要使用 File subclasses 来自定义文件关系。它仅在您直接上传文件时有效,如果您在 CMS 中的其他位置上传文件(例如资产管理员)并希望使用 "Choose existing" 对话框 link 它们,那么它'会失败的。

我建议您只删除 LetterFiles class 并在 DataObject 上使用 many_many 关系。示例:

// Change from this…
private static $has_many = array (
    'LetterFiles' => 'LetterFiles'
);

// … to this:
private static $many_many = array (
    'LetterFiles' => 'File'
);