大家好,
我尝试使用此代码向我的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选项卡,在此选项卡中我有上传字段。
问题是上传字段并不想保留我的文件所以当我选择某个文件时,我在我的查找器中单击“确定”,没有任何反应......有人可以帮助我吗?
感谢托马斯。
答案 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中使用此类1} EM>
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