[Craft CMS]お問い合わせフォームの内容でChatworkのタスクを作る、まではいったものの微妙だった件

要約:Contact Formで送信したらChatworkにタスク作るようにWebhooksを使って設定してみた。が、Craft CMSのJobがCP(管理画面)にアクセスすることで実行されるので、実用的ではない。

Craft CMSにはContact Formというプラグインがあり、簡単にお問い合わせフォームを設置することができます。フォームからお問い合わせすると指定したメールアドレスにお問い合わせ内容を送信します。今回はこの内容を使ってChatworkのタスクを作成する手順を紹介します。

お問い合わせフォーム設置

プラグインストアからインストールし、手順通りに作成すればOKなのでここは割愛します。

Webhooksプラグインインストール

Chatworkのタスクを作るためにWebhooksプラグインをインストール、設定します。

インストール・アクティベート

プラグインストアからインストール・アクティベートします。

設定画面でWebhook作成

管理画面メニューのWebhooks -> Manage Webhooksにアクセスし、『New Webhook』ボタンをクリックします。

するとこんな画面が出てきます。ここで設定していきます。

  • Name : Webhookの名前です。適当なものをどうぞ
  • Sender Class : Webhookを実行するイベントを持つクラスを指定します。今回はお問い合わせフォームデータクラスの “craft\contactform\models\Submission” を指定します。
  • Event Name : Webhookを実行するイベントを指定します。上記のクラスには “afterValidate” というエラーチェック後用のイベントがあるのでこれを利用します。
  • Request Method & URL : こちらはChatwork APIのタスク作成エンドポイントを利用します。MethodはPOST、URLには “https://api.chatwork.com/v2/rooms/{room_id}/tasks”を指定します。{room_id}にはタスクを作るChatworkルームのIDを指定します。
  • Custom Headers : APIへのリクエスト時に追加するリクエストヘッダを指定します。”X-ChatWorkToken”にChatworkトークンを、POSTデータを送信するために”Content-Type”に”application/x-www-form-urlencoded”を指定します。

さらに、Payload(送信データ)をセットするため “custom payload” をチェックし、Payload Templateに以下を記述します。

{% set entry = event.sender %}
{{
 {
    to_ids: {アカウントID},
    body: "お問い合わせがありました\n\nお名前: "~entry.fromName~"\nメールアドレス: "~entry.fromEmail~"\nお問い合わせ内容: "~entry.message
 }|url_encode|raw
}}

{アカウントID}には送信したいユーザのアカウントIDを指定します。Chatwork IDではないので注意してください。

こんな感じ

ここまで設定したら保存しましょう。では実際にお問い合わせしてみます。

これで送信ボタンを押すと。。
Chatworkのタスクが作成されました!

無事Chatworkのタスクが作成されました。なお、Webhookの実行結果は管理画面メニューのWebhooks -> Activityで確認することができます。

ばっちりChatworkにタスクできるんですが、すぐにタスクができたり全然できなかったりなぜか不安定。なぜだろうと調べたところ。。Stack Overflow

Keep in mind Jobs are only executed when someone enters the CP

WebhooksはどうもJobを発行して、Job実行でAPIリクエストするようで、このJobがCP(管理画面)にアクセスすることで実行されるようです。フロント画面でのイベントに対してWebhooksを仕込んだとしても、実行されるのは誰かが管理画面にアクセスした時なので、あまり実用的ではないということが判明しました。
いいところまで言ったのに残念。

ということで、お問い合わせ送信時にChatworkのタスクを作るのであればContact Formのイベントをフックにして、独自で仕込んだ方が良さそうです。

投稿者: Ippei Sumida

フリーランスデベロッパー。大阪を中心にWeb開発をしています。