SilverStripe仅为特定字段重命名上载的文件

时间:2016-08-09 05:08:47

标签: silverstripe

我已扩展CMS设置以上传两个CSS文件。部分SiteConfig扩展代码 -

<?php

//OTHER CODES HERE
$fields->addFieldToTab('Root.Main', $cssfile = UploadField::create(
    'StyleSheet',
    'Style Sheet'
));

$fields->addFieldToTab('Root.Main', $clientcssfile = UploadField::create(
    'ClientStyleSheet',
    'Client Style Sheet'
));
//OTHER CODES HERE
?>

我扩展了File

class FileRenameExtension extends DataExtension {

    function onAfterUpload() {

        $file = $this->owner;
        $file->Name = 'CustomStyle.'.$file->getExtension();
        $file->write();
    }   

}

问题

  1. 代码重命名从所有字段上传的文件,但我想重命名仅从ClientStyleSheet上传的文件。
  2. 在重命名文件之前,如果用户上传名称已存在的文件,则会发出警告,如果单击Overwrite,则会覆盖文件并重命名文件。我只是想要无论文件名是什么,它只是保存文件的名称在File Extension Class
  3. 中指定
  4. 在上传文件之前重命名文件的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

在自定义upload()动作处理程序的情况下,最好直接使用FileField

答案 1 :(得分:0)

使用DataExtension,您可以修改File的所有实例,无论它们在何处上传。

一种可能的解决方案:你继承File并挂钩到onAfterUpload:

class CSSFile extends File {
    function onAfterUpload() {
        $file = $this;
        $file->Name = 'CustomStyle.'.$file->getExtension();
        $file->write();
        parent::onAfterUpload();
    }      
}

现在你在SiteConfig中使用它,它应该像UploadField一样使用UploadField。

如果我理解正确,您希望允许用户向网站添加样式表。然后,另一种解决方案是允许任何文件名并使用模板中的原始文件名:

<link rel="stylesheet" href="$SiteConfig.StyleSheet.URL">

我更愿意使用第二种解决方案。