如何为用户上传的文件添加下载按钮到后端的DataObject?

How to add a download button for a file uploaded by a user to a DataObject in the backend?

我想在 DataObject.

的后端添加一个下载按钮

我在前端有一个上传表单,用户可以在其中上传文件。例如 .jpg 或 .pdf。

class TeamPage_Controller extends Page_Controller
{
    private static $allowed_actions = array(
        'ContactForm'
        );

        $fields = new FieldList(array(
            TextField::create('Email'),
            FileField::create('MapFile')
        ));

        $actions = new FieldList(
            FormAction::create("doSaveSubmission")
        );

        $required = new RequiredFields('Email');

        $form = new Form($this, 'ContactForm', $fields, $actions, $required);

        return $form;


    }

    public function doSaveSubmission($data, $form){

        $submission = new ContactSubmission();
        $form->saveInto($submission);
        $submission->TeamPageID = $this->ID;
        $submission->write();

        return 'Saved into Dataobject';

    }




}

现在在后端,当您从 Gridfield 单击进入各个条目时,我希望能够下载用户上传的文件。是否可以在 "Choose another file" 按钮旁边添加一个按钮,或者自己创建一个位于该按钮部分下方的按钮:

ContactSubmission.php

<?php


class ContactSubmission extends DataObject
{

    private static $db = array(
        'Email' => 'Varchar(255)',
    );

    private static $has_one = array(
        'TeamPage' => 'TeamPage',
        'MapFile' => 'File'
    );


    private static $summary_fields = array(
        'Email'
    );


}

您可以在 DataObject 窗体上添加新操作。

为此,请查看更好的按钮模块。 https://github.com/unclecheese/silverstripe-gridfield-betterbuttons

在操作本身中,您需要通过强制下载 header 让 SilverStripe return 文件。你可以在这里看到其他人正在尝试这样做.. http://www.silverstripe.org/community/forums/general-questions/show/15832

我们可以通过创建新模板来自定义 UploadField 按钮,供 UploadField 使用。它使用的默认模板是 UploadField_FileButtons。我们将复制它来创建我们的新模板。

我们在mysite/templates/includes中创建了一个名为UploadField_FileButtonsWithDownload的模板。在此模板中,我们复制原始 UploadField_FileButtons 并在末尾添加我们的下载 link。

UploadField_FileButtonsWithDownload.ss

<% if $canEdit %>
    <button class="ss-uploadfield-item-edit ss-ui-button ui-corner-all" title="<% _t('UploadField.EDITINFO', 'Edit this file') %>" data-icon="pencil">
    <% _t('UploadField.EDIT', 'Edit') %>
    <span class="toggle-details">
        <span class="toggle-details-icon"></span>
    </span>
    </button>
<% end_if %>
<button class="ss-uploadfield-item-remove ss-ui-button ui-corner-all" title="<% _t('UploadField.REMOVEINFO', 'Remove this file from here, but do not delete it from the file store') %>" data-icon="plug-disconnect-prohibition">
<% _t('UploadField.REMOVE', 'Remove') %></button>
<% if $canDelete %>
    <button data-href="$UploadFieldDeleteLink" class="ss-uploadfield-item-delete ss-ui-button ui-corner-all" title="<% _t('UploadField.DELETEINFO', 'Permanently delete this file from the file store') %>" data-icon="minus-circle"><% _t('UploadField.DELETE', 'Delete from files') %></button>
<% end_if %>
<% if $UploadField.canAttachExisting %>
    <button class="ss-uploadfield-item-choose-another ss-uploadfield-fromfiles ss-ui-button ui-corner-all" title="<% _t('UploadField.CHOOSEANOTHERINFO', 'Replace this file with another one from the file store') %>" data-icon="network-cloud">
    <% _t('UploadField.CHOOSEANOTHERFILE', 'Choose another file') %></button>
<% end_if %>

<a class="ss-ui-button ui-corner-all" title="Download this file" href="$Link" target="_blank" download>Download</a>

然后我们为 MapFile 字段设置 UploadField 模板以使用我们的新模板。

ContactSubmission.php

class ContactSubmission extends DataObject {

    private static $db = array(
        'Email' => 'Varchar(255)'
    );

    private static $has_one = array(
        'TeamPage' => 'TeamPage',
        'MapFile' => 'File'
    );


    private static $summary_fields = array(
        'Email'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        if ($mapFileField = $fields->fieldByName('Root.Main.MapFile')) {
            $mapFileField->setTemplateFileButtons('UploadField_FileButtonsWithDownload');
        }

        return $fields;
    }

}

现在,下载按钮 link 应该出现在 CMS 中的 选择另一个文件 按钮之后。