0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OctoberCMSプラグイン作成:添付ファイル・画像をプログラムから作成する

Posted at

OctoberCMSのバックエンド(管理画面)からデータにファイルや画像をアップロードして添付するのは、フォームの定義だけでロジックの実装なしに実現できる。それに関してはこちら

しかし、プログラムロジックで添付する方法はドキュメントがなかったのでここにメモする。

TL;TR

  • 添付ファイルを持つことになる親モデルクラスにリレーションを作成
  • System\Models\File のインスタンスをnewで作成
  • fromFile($filePath) でファイルを読み込む
  • save() でテーブルに保存
  • 親モデルクラスのリレーションにadd()する
  • 親モデルをsave()する

Productモデルが複数の画像を添付ファイルとして持つケースを例にして詳細を説明する。

リレーションの作成

複数の添付ファイルの場合$attachManyに連想配列で定義する。
配列のキーにフィールド名、値にモデルクラスを指定する。添付ファイルなのでSystem\Models\Fileにする。(クラス名からは分かりづらいが、このモデルが添付ファイル用のモデルである。)

use Model;

class Product extends Model
{
    public $attachMany = ['images' => 'System\Models\File'];
}

注: 2018/10/02現在、まだSystem\Models\Fileのバグは修正されていない。添付ファイルをS3などのクラウドストレージに保持する場合にバグが有る。対処方法はこちらで紹介している。

ファイルの添付

use File; // ファサード
use System\Models\File as AttachmentFile; // 添付ファイルのFileクラス
// ネット上のファイルをテンポラリディレクトリにコピー
// (すでにサーバ上にファイルが有る場合は不要)
$tempPath = temp_path(basename($remoteFileUrl));
File::copy($remoteFileUrl, $tempPath);

// DL下ファイルから添付ファイルオブジェクトを作成
$attachFile = new AttachmentFile();
$attachFile->fromFile($tempPath);

// これ自体テーブルを持つモデルクラスなのでテーブルに保存する
$attachFile->save();

// 親データオブジェクトに追加する
// images() はProductモデルで定義したリレーションから作成されたメソッド
$mdlProduct->images()->add($attachFile);
$mdlProduct->save();

// テンポラリファイルを削除する
File::delete($tempPath);

以上!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?