PowerCMS X ブログ
2024-12-07
アセット(アップロードしたファイル)が多くなったときに、そのアセットが利用されているのか、利用されていないのかを把握したいという要望がありました。画像のように、アセットの編集画面を開くと、「利用状況」(そのアセットが利用されているかどうか、利用されている場合そのオブジェクト編集画面へのリンク)が表示されます。
これと同じように、一覧画面で状況を確認して利用中か未利用かを確認したい、ということです。
現状、状況を確認する機能はありませんが、「システムフィルタ」プラグインを作成することで一覧画面で「利用中のアセット」「未使用のアセット」をフィルタリングできるようにしました。
利用中・未使用の判断に利用する条件は以下のとおりです。
※ この制限事項はアセットの編集画面の右カラムのリストアップの制限事項と同じです。
{
"label": "AssetFilterInUse",
"id": "assetfilterinuse",
"component": "AssetFilterInUse",
"description": "Asset filter in use or not in use on the list screen.",
"version": "0.1",
"author": "Alfasado Inc.",
"author_link": "https://alfasado.net",
"system_filters": {
"filter_asset_in_use": {
"asset": {
"filter_asset_in_use": {
"name": "filter_asset_in_use",
"label": "Assets in use",
"component": "AssetFilterInUse",
"method": "filter_asset_in_use",
"order": 2000
}
}
},
"filter_asset_not_in_use": {
"asset": {
"filter_asset_not_in_use": {
"name": "filter_asset_in_use",
"label": "Assets not in use",
"component": "AssetFilterInUse",
"method": "filter_asset_not_in_use",
"order": 2001
}
}
}
}
}
<?php
require_once( LIB_DIR . 'Prototype' . DS . 'class.PTPlugin.php' );
class AssetFilterInUse extends PTPlugin {
function __construct () {
parent::__construct();
}
function filter_asset_in_use ( $app, &$terms, $model, $option, &$args, &$extra, &$ex_vals ) {
// INで絞り込む
$terms = ['id' => ['IN' => $this->in_use_asset_ids( $app ) ] ];
}
function filter_asset_not_in_use ( $app, &$terms, $model, $option, &$args, &$extra, &$ex_vals ) {
// NOT INで絞り込む
$terms = ['id' => ['NOT IN' => $this->in_use_asset_ids( $app ) ] ];
}
function in_use_asset_ids ( $app ) {
// リレーション
$relations = $app->db->model( 'relation' )->load_iter( ['to_obj' => 'asset'], null, 'to_id' );
$ids = $relations->fetchAll( PDO::FETCH_COLUMN );
// 数値型カラム
$columns = $app->db->model( 'column' )->load( ['type' => 'int', 'disp_edit' => 'relation', 'rel_model' => 'asset'], null, 'name,table_id' );
foreach ( $columns as $column ) {
$table = $app->db->model( 'table' )->load( $column->table_id, null, 'name' );
if (! $table ) continue;
$app->get_scheme_from_db( $table->name );
$objs = $app->db->model( $table->name )->load_iter( [ $column->name => ['!=' => 0 ] ], null, $column->name, " AND {$table->name}_{$column->name} IS NOT NULL" );
$ids = array_merge( $objs->fetchAll( PDO::FETCH_COLUMN ), $ids );
}
// フィールド
$field_type_asset = $app->field_type_asset ? $app->field_type_asset : 'asset,assets,image,images,video,videos';
$field_type_asset = explode( ',', $field_type_asset );
$meta_fields = $app->db->model( 'meta' )->load(
['meta_kind' => 'customfield', 'meta_type' => ['IN' => $field_type_asset ] ], null, 'data' );
foreach ( $meta_fields as $meta_field ) {
$asser_ids = explode( ':', trim( $meta_field->data, ':' ) );
if (!empty( $asser_ids ) ) {
foreach ( $asser_ids as $asser_id ) {
if ( $asser_id && is_numeric( $asser_id ) ) {
$ids[] = $asser_id;
}
}
}
}
return array_unique( $ids );
}
}