PowerCMS X ブログ

2021-12-15

ダウンロードフォームをプラグインで作成する

資料請求フォームで、個人情報などを入力していただき、その後PDFをダウンロードするようなフォームを作成したいようなケースに対応するプラグインを作成してみます。せっかくなので、PluginStarterプラグインを利用して作成する手順をご紹介します。このWebサイトでは、開発者登録フォームと最新版ダウンロードフォームでこの仕組を利用しています。

開発者ダウンロードフォーム

プラグインひな形の作成画面

項目 説明
名前 プラグインのクラス名 DeveloperRegister
バージョン プラグインのバージョン 0.1
作成者 プラグインの作成者 Alfasado Inc.
作成者URL プラグインの作成者URL https://alfasado.net
説明 プラグイン一覧画面に表示される概要 Download the source code after registering the developer license.
説明 (日本語) プラグイン一覧画面に表示される概要の日本語訳 開発者ライセンス登録後にソースコードをダウンロードさせます。

「コンタクト」モデルの「pre_save」コールバックを登録する

画面の中ほど「コールバック」「オブジェクト」の左側の「+」ボタンをクリックします。モデル「コンタクト」種別「pre_save」優先後「1」を指定して、画面下部の「保存」をクリックして保存します。その後、「エクスポート」ボタンをクリックするとプラグインのひな形がダウンロードされますので、PHPファイルに行いたい処理を書けばプラグインの完成です。最終的なプラグインを以下に添付します。

post_saveコールバックとは?

文字通り、当該のオブジェクトが保存された後に処理を割り込む仕組みのことをいいます。post_saveコールバックが呼ばれた時点で、バリデーション済み、保存済みとなりますので、ここで完了画面を返す代わりにソースをダウンロードさせるような処理を書き、exit(); して処理を打ち切ることでダウンロードフォームにすることができます。尚、保存前は「pre_save」、バリデーション後に更にチェックを行ってエラーを返すような処理では「save_filter」コールバックを指定してください。

コードはとてもシンプルです。

plugins/DeveloperRegister/config.json

{
    "label": "DeveloperRegister",
    "id": "developerregister",
    "component": "DeveloperRegister",
    "description": "Download the source code after registering the developer license.",
    "version": "0.1",
    "author": "Alfasado Inc.",
    "author_link": "https://alfasado.net",
    "callbacks": {
        "developerregister_pre_save_contact": {
            "contact": {
                "pre_save": {
                    "component": "DeveloperRegister",
                    "priority": 1,
                    "method": "pre_save_contact"
                }
            }
        }
    }
}

plugins/DeveloperRegister/DeveloperRegister.php

<?php
require_once( LIB_DIR . 'Prototype' . DS . 'class.PTPlugin.php' );
class DeveloperRegister extends PTPlugin {
    function __construct () {
        parent::__construct();
    }
    function pre_save_contact ( &$cb, $app, &$obj, $original ) {
        $form = $cb['form'];
        if ( $app->id != 'Bootstrapper' || $form->basename != 'developer-download' ) {
            // 管理画面からコンタクトを保存した時、フォームのベースネームが「developer-download」でないときは通常の処理
            return true;
        }
        PTUtil::export_data( '/var/www/package/developer/PowerCMSX.zip' );
        exit();
    }
}

PTUtilクラスは汎用的に利用できるスタティックメソッドをまとめたクラスです。export_dataのコードは以下のようになっています。

    public static function export_data ( $path, $mimetype = '' ) {
        $file_size = filesize( $path );
        $file_name = basename( $path );
        if (! $mimetype ) {
            $extension = isset( pathinfo( $path )['extension'] )
                       ? pathinfo( $path )['extension'] : '';
            $mimetype = self::get_mime_type( $extension );
        }
        header( "Content-Type: {$mimetype}" );
        header( "Content-Length: {$file_size}" );
        header( "Content-Disposition: attachment;"
            . " filename=\"{$file_name}\"" );
        header( 'Pragma: ' );
        while ( ob_get_level() ) {
            ob_end_flush();
        }
        flush();
        readfile( $path );
    }

実際の開発者登録の処理

この記事の例では単なるダウンロードですが、実際の開発者登録フォームでは以下のような処理を入れています。

このサイトのPowerCMS Xでは「ライセンスコード」というモデルを作成していて、フォームからの投稿時に重複しないライセンスコードを発行して、メールのテンプレートを Backlogに登録、あからさまな競合会社でないことだけ確認してからライセンスコードを有効化して、メールを送信します。さらに、ダウンロード時には発行済の開発者ライセンスコードと一致するかどうかをチェック。プラグインの処理としては、下記の処理を追加します。

  • 登録時にユニークな開発者ライセンスを発行して出力するファンクション・タグ (その際にステータス無効でライセンスコードモデルに仮登録)
  • 登録済み開発者ライセンスコードかどうかをチェックするフォームのバリデーション

PluginStarterプラグインを利用して、最小限の PHPコードを書くことで、Webサイトに必要な機能を最小限の手間で作成できることがおわかりいただけたかと思います。

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

投稿者:Junnama Noda

ブログ内検索

アーカイブ