concrete5 カスタマイズ例:ファイルをページごとのフォルダで管理する

菱川拓郎
菱川拓郎

コンクリートファイブジャパン 菱川です。concrete5 のカスタマイズの小ネタの更新です。

concrete5 では、ファイルをファイルマネージャーで管理します。ファイルマネージャーでは、ファイルをフォルダに分けて管理することができます。この記事では、ページごとのフォルダを自動的に作成し、ページの編集の際にファイルマネージャーを開いた際に、そのフォルダを開いた状態にする方法をご紹介します。

このような軽いカスタマイズは、application/bootstrap/app.php に書くのが concrete5 のよくあるカスタマイズ方法になります。下記が記載例です。

// on_page_view イベントにフックして処理を追加
$app['director']->addListener('on_page_view', function($event) {
    // イベントのオブジェクトから、現在開いているページのオブジェクトを取得
    $page = $event->getPageObject();
    // 編集権限があるかどうかをチェックする
    $cp = new \Concrete\Core\Permission\Checker($page);
    if ($cp->canEditPageContents() || $cp->canEditPageProperties() || $cp->canApprovePageVersions()) {
        // ページIDを使って一意なフォルダ名を指定する
        $folderName = 'Page ' . $page->getCollectionID();
        // ファイルマネージャーツリーを取得
        $tree = \Concrete\Core\Tree\Type\FileManager::get();
        // フォルダ名からノードを取得
        $node = $tree->getNodeByDisplayPath($folderName);
        // フォルダが存在しなかった場合にフォルダを作成する
        if (!is_object($node)) {
            $filesystem = new \Concrete\Core\File\Filesystem();
            $root = $filesystem->getRootFolder();
            $node = $filesystem->addFolder($root, $folderName);
        }
        // ファイルマネージャーの検索結果の初期設定にフォルダを指定する
        $stickyRequest = new \Concrete\Core\Search\StickyRequest('file_manager_folder');
        $stickyRequest->addToSearchRequest('folder', $node->getTreeNodeID());
    }
});

このコードを記載すると、ページの追加・編集の際にファイルを追加しようとすると、「Page 123」(123はページのID)のようなページごとのフォルダが開いた状態でファイルマネージャーが起動します。もしページごとのフォルダを作るのを標準ルールにしたい場合、いちいちフォルダを作成して開く手間を省くことができるでしょう。

このコードを応用すれば、ユーザーごとのフォルダ、ページタイプごとのフォルダなど、アイディア次第でフォルダを自動的に作成して開いておくことができますので、運用に合わせて活用してみてください。