PowerCMS X ブログ

2024-12-07

アセットの利用中・未使用の状態を一覧画面でフィルタリングしたい

アセット(アップロードしたファイル)が多くなったときに、そのアセットが利用されているのか、利用されていないのかを把握したいという要望がありました。画像のように、アセットの編集画面を開くと、「利用状況」(そのアセットが利用されているかどうか、利用されている場合そのオブジェクト編集画面へのリンク)が表示されます。

これと同じように、一覧画面で状況を確認して利用中か未利用かを確認したい、ということです。

アセットの編集画面。右カラムに利用状況(利用されているオブジェクトへのリンク)が表示されている。

現状、状況を確認する機能はありませんが、「システムフィルタ」プラグインを作成することで一覧画面で「利用中のアセット」「未使用のアセット」をフィルタリングできるようにしました。

追加されたシステムフィルタ「利用中のアセット」「未使用のアセット」

プラグインのダウンロード

追加されるシステムフィルタ

  • 利用中のアセット
  • 未使用のアセット

仕様

利用中・未使用の判断に利用する条件は以下のとおりです。

  • リレーション型・モデル「アセット」のカラム
  • 数値型・モデル「アセット」のカラム
  • フィールド「アセット」「アセット (複数)」「画像」「画像 (複数)」「ビデオ」「ビデオ (複数)」

制限事項

  • エディタに貼り付けたり(貼り付けただけでリレーションなどの関連付けのないもの)、ビューに直書きされているものについては対象外となります。
  • プラグイン「ComponentBlocks」によるコンポーネントブロック、複数の入力値を指定などしているカスタマイズ済みフィールドは対象外となります。

※ この制限事項はアセットの編集画面の右カラムのリストアップの制限事項と同じです。

config.json

{
    "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
                }
            }
        }
    }
}

AssetFilterInUse.php

<?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 );
    }
}

カテゴリー:プラグイン | 技術情報 | サポート

投稿者:Junnama Noda

ブログ内検索

アーカイブ