Как добавить много файлов с полем загрузки silverstripe

Всем привет,

Я пытаюсь добавить более 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 {

}

Итак, чтобы было понятно: я пытаюсь добавить некоторый DocumentFile в свой DocumentPageAcces1. Когда я выполняю этот код, у меня есть в моем DocumentPageAcces1 вкладка DocumentsFiles, и на этой вкладке у меня есть поле загрузки.

ПРОБЛЕМА заключается в том, что поле загрузки не хочет сохранять мой файл, поэтому, когда я выбираю какой-либо файл, я нажимаю «ОК» в моем поисковике, и ничего не происходит..... Может ли кто-нибудь мне помочь?

Спасибо, Томас.


person tomzi    schedule 25.07.2013    source источник


Ответы (3)


UploadField не предназначен для работы с DataObjects, но, как вы обнаружили с File или его подклассами.

Хотя в вашем случае я не думаю, что вам нужен подкласс, поэтому вы можете просто удалить свой класс DocumentFileDo, расширяющий File, и использовать его в своем DocumentPageAcces1.php.

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

В случае, если вы хотите иметь больше контроля/деталей в файлах, которые вы загружаете (например, добавить описания, заголовки и т. д.), в этом случае вы можете создать DataObject, который имеет отношение $has_one к File, а затем использовать этот DataObject в отношении на вашей странице с GridField:

Файл Документа.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;
}
person colymba    schedule 28.07.2013
comment
Спасибо за ответ, на самом деле ваше решение подходит, если у меня есть только один тип документа. Но если мне нужно добавить некоторые другие, мне нужно создать DataObject, иначе Silverstripe связывает оба файла. - person tomzi; 31.07.2013
comment
не уверен, что я действительно понимаю, что вы имеете в виду? Вы хотите связать много файлов на одной странице? Все классы File или подклассы? - person colymba; 31.07.2013

Через несколько часов я нашел решение, возможно, оно не самое лучшее, но мне оно подходит ->

Я создал класс, который расширяет класс 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!

person tomzi    schedule 26.07.2013

Я просто боролся с тем же самым. SilverStripe даже имеет (ошибочное*) руководство для разработчиков на этот вопрос (хотя я искал его часами) … В любом случае, я нашел решение. (при условии, что SilverStripe 4)

мой сайт/страница/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.
}

мойсайт/_config/app.yml

SilverStripe\Assets\File:
    extensions:
        - DocumentFileExtension

themes/mytheme/templates/Layout/MyCustomPage.ss

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

Вы в основном расширяете собственный класс File в его пользовательскую версию, и «внезапно» неизмененный UploadField (который также делает то же самое для отдельных файлов) теперь позволяет использовать несколько файлов; в комплекте с графическим интерфейсом и всем остальным.

Надеюсь, что это работает для вас.


* Они продолжают использовать 'Foo' => 'Bar' на всех своих страницах официальной документации вместо 'Foo' => Bar::class, который вы должны использовать в ss4, чтобы избежать исключения:

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

person WoodrowShigeru    schedule 17.05.2018