【问题标题】:OctoberCMS: detect if new image uploadedOctoberCMS:检测是否上传了新图像
【发布时间】:2020-09-21 07:55:42
【问题描述】:

如何检测新图片是否已从后端表单上传到图库,以便在保存之前对其进行操作。

我尝试了以下方法,但没有成功:

<?php namespace Author\Plugin\Models;

use Model;

class ModelName extends Model
{
    public $attachMany = [
        'gallery' => 'System\Models\File',
    ];

    public function beforeSave()
    {
        if (Input::hasFile('gallery')) {
            trace_log('new files');
        } else {
            trace_log('no new files');
        }
    }
}

-- 无论我是否上传新文件,它都会一直提示我没有新文件

【问题讨论】:

  • 你想要全局还是只针对你的模型
  • 我猜是这个模型特有的。但我会考虑两种方式。
  • @HardikSatasiya 你有解决方案吗?或者至少可以为我指明正确的方向?我想要完成的是,每当新图像上传到画廊时,我都想调整它们的大小,这样它们就不会占用不必要的空间,因为它们非常大(8-16mb),而且我不能让用户在上传之前手动调整它们的大小。我知道您关于调整大小的其他答案,但它不涉及检测我需要调整大小的正在上传的新图像。
  • 我添加了答案,请检查它是否有效,确保替换您的模型名称和属性名称等值。

标签: octobercms octobercms-plugins octobercms-backend


【解决方案1】:

您可以使用此代码调整模型的图像大小

它有点棘手,因为它使用了不同的绑定。

您可以在插件的plugin.php's boot method 中使用此代码

use October\Rain\Database\Attach\Resizer;
// .. other code ...

public function boot() {

  \Hardik\SoTest\Models\Item::extend(function($model) {
    // for create time only
      $model->bindEvent('model.beforeCreate', function() use ($model) {

        $records = \October\Rain\Database\Models\DeferredBinding::where([
          'master_type' => 'Hardik\SoTest\Models\Item', // <- REPLACE WITH YOUR MODEL(ModelName)
          "master_field" => "picture", // <- REPLACE WITH ATTACHEMNT MODEL (gallery)
          "slave_type" => "System\Models\File",
          "session_key" => post('_session_key')
        ])->get();

        foreach($records as $record) {
          $fileRecord = \System\Models\File::find($record->slave_id);

          // code to resize image
          $width = 100;
          $height = 100;
          $options = []; // or ['mode' => 'crop']

          // just in place resize image
          Resizer::open($fileRecord->getLocalPath()) // create from real path
                    ->resize($width, $height, $options)
                    ->save($fileRecord->getLocalPath());
        }
      });
  });      
}

如有任何疑问,请发表评论。

【讨论】:

  • FileUpload 表单小部件有一个卸载处理程序:octobercms.com/docs/api/backend/formwidgets/fileupload#onupload。如果我将以下代码 Resizer::open($uploadedFile-&gt;getPathName())-&gt;resize(500, 300, ['mode' =&gt; 'crop'])-&gt;save($uploadedFile-&gt;getPathName()); 放在小部件 php 文件的 line 431 之后:~/modules/backend/formwidgets/FileUpload.php,它运行良好。有没有办法在我的插件中挂钩该方法而不是修改核心文件?
  • 我上面的评论中演示的代码行的功能完全符合我的要求,唯一的问题是我不知道如何从我的插件中访问 onUpload() 方法,所以它坚持了下来。在接受并支持您的解决方案之前,我想先探索一下这个选项。您对如何从我的插件后端访问 FileUpload 表单小部件的onUpload() 方法有任何想法吗?
  • 你不能在那里做很多事情,因为该方法onUpload 中没有事件或扩展功能,所以那里没有运气,要么更改核心文件this not the way to do things,要么制作你自己的小部件,在那里工作更多在这种情况下只有这两个选项。
猜你喜欢
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多