blogスタッフブログ
HOME > スタッフブログ > CMS >PHPを用いたPowerCMS Xのオブジェクト操作(バイナリデータ編)

PHPを用いたPowerCMS Xのオブジェクト操作(バイナリデータ編)

PHPを用いたPowerCMS Xのオブジェクト操作(リレーション編)」の続編です。アセット、つまり画像等のバイナリデータをどのように扱うかを解説したいと思いますが、バイナリデータを保存するカラムもタイプが「バイナリ」(MySQL上ではlongblob)というだけで、基本的な性質はテキストを保存するカラムと変わりません。下記のようにバイナリデータをそのまま入れてやるだけなのです。

$assetPath = '/Users/abe/pictures/sample.jpg';
$asset->file(file_get_contents($assetPath));

テキストデータと異なるのが画像に付随するデータの存在(メタデータ)、そしてサムネイル画像の生成等です。メタデータはアセットモデルや添付ファイルモデルだけでなく、管理画面では直接見ることができないメタモデルに保存されています。よって、下記のようなメソッドを実行する必要があります。

// メタデータをセット(アセットの場合のみ)
$metadata = PTUtil::get_upload_info($app, $assetPath, $error);
$uploadUtilities = $app->component('UploadUtilities');
$uploadUtilities->set_asset_meta($asset, $metadata['metadata']);

// 保存
$asset->save();

// ファイルとアセット(添付ファイル)の紐付け(これを実行しないとプレビューしてもindex.phpがダウンロードされます)
$asset = PTUtil::file_attach_to_obj($app, $asset, 'file', $assetPath, $label, $error);

サンプルコード

まとめると、アセットは下記のようなコードでアップロードができます。

<?php
require_once 'class.Prototype.php';
$app = new Prototype(['id' => 'Worker']);
$app->logging = true;
$app->init();

// 画像情報
$assetPath = '/Users/abe/pictures/sample.jpg';
$label = 'サンプル画像';
$fileName = 'sample.jpg';
$uploadPath = 'assets/';
$error = '';

// アセットの新規作成
$asset = $app->db->model('asset')->new();
$asset->label($label);
$asset->extra_path($uploadPath);
$asset->file_name($fileName);
$asset->status(4); // ステータス
$asset->user_id(1); // ユーザーID
$asset->file(file_get_contents($assetPath)); // 画像データ…file_get_contentsでバイナリデータを取得してそのままセットします

// メタデータと作成日・作成者・UUID等のデータをセット
$metadata = PTUtil::get_upload_info($app, $assetPath, $error);
$uploadUtilities = $app->component('UploadUtilities');
$uploadUtilities->set_asset_meta($asset, $metadata['metadata']);
$app->set_default($asset);

// 保存
$asset->save();

// ファイルとアセットの紐付け(これを実行しないとプレビューしてもindex.phpがダウンロードされます)
$asset = PTUtil::file_attach_to_obj($app, $asset, 'file', $assetPath, $label, $error);

// パブリッシュ(ステータスが公開以外はURLの生成のみ行われます)
$app->publish_obj($asset);

添付ファイルの場合はモデル内のカラム構成が若干違うのと、オブジェクトを作成した後で記事オブジェクト等とリレーションの設定が必要です。

<?php
require_once 'class.Prototype.php';
$app = new Prototype(['id' => 'Worker']);
$app->logging = true;
$app->init();

// 画像情報
$imagePath = '/Users/abe/pictures/sample.jpg';
$imageExtension = preg_replace('/.*\.([^\.]+)$/', '$1', $imagePath);
$label = 'サンプル画像';
$fileName = 'sample.jpg';
$error = '';

// アセットの新規作成
$mime_type = PTUtil::mime_types()[$imageExtension];
$attachment_class = strpos($mime_type, 'image') !== false ? 'image' : 'file';

$attachment = $app->db->model('attachmentfile')->new();
$attachment->name($label);
$attachment->mime_type($mime_type);
$attachment->class($attachment_class);
$attachment->file_name($fileName);
$attachment->user_id(1); // ユーザーID
$attachment->modified_by(1); // ユーザーID
$attachment->file(file_get_contents($imagePath)); // 画像データ…file_get_contentsでバイナリデータを取得してそのままセットします
$attachment->size(filesize($imagePath));

// 作成日・作成者・UUID等のデータをセット
$app->set_default($attachment);

// 保存
$attachment->save();

// ファイルとアセットの紐付け(これを実行しないとプレビューしてもindex.phpがダウンロードされます)
$attachment = PTUtil::file_attach_to_obj($app, $attachment, 'file', $image_path, '', $error);

// 記事オブジェクト等と紐付ける(掲載省略)

まとめ

前回の記事と今回の記事でPowerCMS Xのオブジェクトを思うがままに扱えるようになるのでは?と思います。PHPを用いたプログラミングができれば基幹システムや外部システムのデータをインポートしてHTMLファイルを生成する等の対応ができるようになります。また、大規模サイトのリニューアル案件等では多くのオブジェクトを一度に編集したくなる状況がかなりの確率で発生します。そのような場面で今回の記事が役立てば幸いです。

最近の記事

カテゴリ

アーカイブ

スタッフ別