【问题标题】:Resize images on upload in Silverstripe ModelAdmin在 Silverstripe ModelAdmin 中调整上传图像的大小
【发布时间】:2015-09-08 14:56:30
【问题描述】:

我是 Silverstripe 的新手,在文档或 SO 上找不到我的问题的答案。

我将 Silverstripe 纯粹用作 CMS:没有网站作为前端。

我有一个最简单的 DataObject Product 和一个 ModelAdmin ProductAdmin 如下:

class Product extends DataObject
{

  private static $db = array(
    'Name' => 'Varchar',
    'Copy' => 'Text'
  );

  private static $has_one = array(
    'MyImage' => 'Image'
  );

}


class ProductAdmin extends ModelAdmin
{

  private static $managed_models = array(
    'Product'
  );

  private static $url_segment = 'product';

  private static $menu_title = 'Product';

}

/dev/build 之后,我的管理面板就构建好了,我可以像往常一样将高分辨率图像上传到“上传”目录。

我希望 在上传时让 CMS 将图像重新采样为几种不同的尺寸,同时保留原始图像。新的和原始的图像也需要保存到 FlushGeneratedImagesTask 不会删除它们的位置。通过查看文档,我知道可以轻松调整图像大小,但我不清楚在哪里(或如何)添加所需的自定义功能。有人可以帮忙吗?

(我认为Silverstripe 3.1 - resize image on upload 最接近于回答这个问题,但是缺少一个步骤来说明如何让 CMS 使用新的/覆盖的功能。)

我使用的是 Silverstripe 3.1 版

【问题讨论】:

    标签: silverstripe


    【解决方案1】:
    1. 创建一个扩展 Image 的新类 MyImage。
    2. 在您的 MyImage 类中创建一个函数 onBeforeWrite()
    3. 在此函数中,创建一个新图像$image = Image::create()。您可以在此处设置重采样图像的文件名、名称、标题、ParentID 等
    4. 使用$image->SetWidth(...) 调整图像大小
    5. 更新你的数组Product::$has_oneMyImage => MyImage

    【讨论】:

    • 感谢您回答艾略特。我似乎仍然在这里错过了一步。我是否将Image 子类化为MyImage?在标准上传期间,我使用什么内部机制让 SS 识别这个新类而不是 Image?提前致谢!
    • 抱歉,我认为 MyImage 已经是 Image 的子类。因为Image继承自DataObject,所以onBeforeWrite会自动运行。我将编辑我的答案以反映这一点
    • 完美。再次感谢!
    • 还有一件事。我需要以某种方式将我当前的图像$this 转换为$image,因为我显然无法保存$image,直到其中包含一些要保存的内容!我假设我应该在onBeforeWrite() 中写入$image,并让parent::onBeforeWrite() 完成保存原始图像的工作。
    • 你可以使用onAfterWrite进行重采样,在原始图像被写入之后。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多