PowerCMS X Q&A

PowerCMS Xを用いてWebサイトを構築する際の技術的なヒントや解決策をご紹介します。

特定の人からのフォーム投稿を受付拒否することはできますか?

プラグインでcontactモデルのpre_saveコールバックを利用して投稿内容をチェックし、指定の条件にマッチした場合はフォーム投稿の受付を拒否することができます。

例えばform_reject_addressモデルを作成して名前・メールアドレス・ステータス(有効 or 無効)を登録し、メールアドレスのチェックを行う場合は下記のようになります。

<?php
require_once LIB_DIR . 'Prototype' . DS . 'class.PTPlugin.php';

class FormBlackList extends PTPlugin
{
    public function __construct () {
        parent::__construct();
    }

    public function pre_save_contact(&$cb, $app, $contact)
    {
        $blackListPDO = $app->db->model('form_reject_address')->load_iter(['status' => 2], null, 'email');
        $blackListAddress = $blackListPDO->fetchAll(PDO::FETCH_COLUMN, 0);

        if (in_array($contact->email, $blackListAddress)) {
            $cb['error'] = 'お問い合わせの受付に失敗しました。(エラーコード: X01)';

            $questionKeys = json_decode($contact->question_map, true);
            $inputData = json_decode($contact->data, true);
            $logData = [];
            foreach ($inputData as $key => $value) {
                if (array_key_exists($key, $questionKeys)) {
                    $logData[$questionKeys[$key]] = $value;
                }
            }
            $app->log([
                'message' => 'お問い合わせをブロックしました。',
                'metadata' => json_encode(['投稿内容' => $logData], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT),
                'model' => 'contact',
            ]);

            return false;
        }

        return true;
    }

}

フォームに入力した内容は$cb['values']から取得できますので、NGワードを設定して拒否する等も可能です。

関連するQ&A