1

大家好

我正在尝试使用此代码向我的上传字段添加 1 个以上的文件->

class FileDo extends File {

    static $has_one = array(
        'DocumentsFile' => 'DocumentsFile',

    );
}


class DocumentsFile extends DataObject {


    static $has_one = array(
        'DocumentPageAcces1' => 'DocumentPageAcces1'
    );
    static $has_many = array(
        'Files' => 'FileDo'
    );


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

        $fields->removeByName('DocumentPageAcces1ID');


         return $fields;
    }

    public function onBeforeWrite() {
        parent::onBeforeWrite();
        $page = DataObject::get_one('DocumentPageAcces1');
        if($page) {
             $this->DocumentPageAcces1ID = $page->ID;
        }
    }

}




class DocumentPageAcces1 extends Page {


     static $has_many = array(
        'DocumentsFiles' => 'DocumentsFile',
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();


    $fields->addFieldToTab('Root.Main', new TextareaField('DocumentsIntro_en', "Document Introduction"));
    $fields->addFieldToTab('Root.Main', new TextareaField('PublicationsIntro_en', "Publication Introduction"));


    $fields->addFieldToTab('Root.FR', new TextareaField('DocumentsIntro_fr', "Document Introduction"));
    $fields->addFieldToTab('Root.FR', new TextareaField('PublicationsIntro_fr', "Publication Introduction"));


    $fields->addFieldToTab('Root.NL', new TextareaField('DocumentsIntro_nl', "Document Introduction"));
    $fields->addFieldToTab('Root.NL', new TextareaField('PublicationsIntro_nl', "Publication Introduction"));


     $upload = new UploadField(
        'DocumentsFile',  
        'Document',  
        $this->DocumentsFiles()
    ); 

    $fields->addFieldToTab('Root.DocumentsFile',  $upload);

    $fields->removeByName('Content'); 
    $fields->removeByName('Metadata'); 



    return $fields;
} 

}
class DocumentPageAcces1_Controller extends Page_Controller {

}

所以说清楚:我正在尝试在我的 DocumentPageAcces1 中添加一些 DocumentFile。当我执行此代码时,我的 DocumentPageAcces1 中有 DocumentsFiles 选项卡,在此选项卡中我有上传字段。

问题是上传字段不想保留我的文件,所以当我选择一些文件时,我在查找器中单击“确定”,没有任何反应......有人可以帮我吗?

谢谢托马斯。

4

3 回答 3

0

UploadField不是用来工作的,DataObjects而是像你发现的那样,File或者它的子类。

尽管在您的情况下,我认为您不需要子类,因此您可以删除DocumentFileDo扩展的类File并在DocumentPageAcces1.php中使用它

static $has_many = array(
    'DocumentFiles' => 'File',
);

如果您希望对上传的文件有更多控制/详细信息(即添加描述、标题等),在这种情况下,您可以创建一个DataObject与 a 有 $has_one 关系的 a File,然后DataObject在关系中使用它在您的页面上使用GridField

文档文件.php

class DocumentFile extend DataObject
{
    static $db = array(
        'Description' => 'HTMLText'
    );

    static $has_one = array(
        'File' => 'File'
    );
}

DocumentPageAccess1.php

static $has_many = array(
    'DocumentFiles' => 'DocumentFile'
);

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

    $c = new GridFieldConfig_RelationEditor();
    $f = new GridField('Documents', 'DocumentFiles', $this->DocumentFiles(), $c);
    $fields->addFieldToTab('Root.Documents', $f);

    return $fields;
}
于 2013-07-28T08:55:09.937 回答
0

几个小时后,我找到了一个解决方案,也许它不是最好的,但它对我有用->

我为我需要的每种文档类型创建了一个扩展 File 类的类,例如

class DocumentFileDo extends File {
    static $has_one = array(
        'DocumentPageAcces1' => 'DocumentPageAcces1'
    );
}

在我的 DocumentPageAcces1.php 中,我有一个类似这样的 has_many 关系:

static $has_many = array(
    'DocumentFileDos' => 'DocumentFileDo',
);

我有 getCMSFields 函数:

$fields->addFieldToTab('Root.Document', new UploadField('DocumentFileDos'));

它运作良好,您可以添加许多文件,只需一个 has_many 关系和一个 UploadField。但是,如果您有一百种不同的文档类型,我认为这不是最好的..

PS:使用 UploadField 你可以拖放文件,但是这个在 Chrome 上运行良好的功能在 Firefox 上却不行!

于 2013-07-26T07:01:26.273 回答
0

我只是在同样的事情上挣扎。SilverStripe 甚至有一个关于这个问题的(错误的*)开发人员指南(虽然我花了几个小时才找到它)......无论如何,我找到了一个解决方案。(假设 SilverStripe 4)

mysite/page/MyCustomPage.php

class MyCustomPage extends Page
{
    private static $many_many = array(
       'DocumentFiles' => File::class
    );

    public function getCMSFields(){

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.Main',
            UploadField::create('DocumentFiles', 'My Documents')
        );

        return $fields;
    }
}

mysite/extensions/DocumentFileExtension.php

class DocumentFileExtension extends DataExtension
{
    private static $belongs_many_many = array(
        'DocumentContainers' => MyCustomPage::class
    );

    // I actually don't know the purpose of the name "DocumentContainers"
    // ("Galleries" in the guide); it is never referenced again.
}

mysite/_config/app.yml

SilverStripe\Assets\File:
    extensions:
        - DocumentFileExtension

主题/mytheme/templates/Layout/MyCustomPage.ss

<% loop $DocumentFiles %>
    $Link
<% end_loop %>

您基本上将本机File类扩展为它的自定义版本,并且“突然”未更改的 UploadField(对单个文件也一样)现在允许多个文件;完成一个 GUI 和一切。

希望这对你有用。


* 他们一直'Foo' => 'Bar'在他们的官方文档页面上使用,而不是'Foo' => Bar::class,您必须在 ss4 中使用它以避免异常:

Uncaught InvalidArgumentException: many_many relation SilverStripe\Blog\Model\BlogPost.DownloadFiles references class File which doesn't exist

于 2018-05-17T15:30:39.267 回答