如何使用silverstripe uploadfield添加许多文件

时间:2013-07-25 10:44:04

标签: php web silverstripe

大家好

我尝试使用此代码向我的uploadfield添加多个文件 - >

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选项卡,在此选项卡中我有上传字段。

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

感谢托马斯。

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:0)

UploadField不适用于DataObjects,但与File或其子类一样。

虽然在您的情况下,我认为您不需要子类,因此您可以删除扩展DocumentFileDo的{​​{1}}类并在 DocumentPageAcces1.php中使用此类

File

如果您希望对上传的文件(即添加说明,标题等)有更多控制/详细信息,那么您可以创建一个与$ has_one关系的static $has_many = array( 'DocumentFiles' => 'File', ); DataObject然后使用File在页面关系中DataObject使用GridField

<强> DocumentFile.php

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

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

<强> DocumentPageAcces1.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;
}

答案 2 :(得分:0)

我只是在努力做同样的事情。 SilverStripe在这个问题上甚至有一个(错误的*)developer guide(虽然花了我几个小时才找到它)......无论如何,我找到了一个解决方案。 (假设SilverStripe 4)

mysite的/页/ 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的/扩展/ 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的/模板/布局/ 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