【问题标题】:SilverStripe renaming uploaded file only for specific fieldSilverStripe 仅针对特定字段重命名上传的文件
【发布时间】:2016-08-09 05:08:46
【问题描述】:

我已扩展 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. 在文件上传之前重命名文件的正确方法是什么?

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用 DataExtension,您可以修改 File 的所有实例,无论它们上传到哪里。

      一种可能的解决方案:您将 File 子类化并挂接到 onAfterUpload:

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

      现在您在 SiteConfig 中使用它,它应该可以像标准文件一样与 UploadField 一起使用。

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

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

      我更喜欢使用第二种解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 1970-01-01
        相关资源
        最近更新 更多