marketo  申し込みフォームの受付人数に制限を設ける。

5月より転職してマーケターとなり、 Marketo なるものを触り始めた。

Marketoで作った弊社イベントへの参加フォームをサイトに設置してあるが、
受付人数や開催終了後に毎度手動でリンクを閉じないと行けなかったので、これを自動化した。

rest apiから取得。

## やりたかったこと
開催日経過後、またはフォーム（プログラム・キャンペーン）への申し込み人数が規定の人数を上回った際に自動的にリンクを切り替えるというもの。

## 生成したコード
```

function ReceptTable ( $date, $time, $place, $organizer, $link, $maxNum, $programId, $is_closed ) {	
        $formLink;
        
        if ($is_closed) {
            if (date("Y/m/d") > $date) {
                $formLink = "<td><span>受付終了</span>";
            } else {
                if (isNotFull($maxNum, $programId)) { // 
                    $formLink = "<td><a href={$link} >申込み</a></td>";
                } else {
                    $formLink = "<td><span>受付終了</span></td>";
                }
            }
        } else {
            $formLink = "<td><span>受付終了</span></td>";
        }

        print "<tr><td>".getOmittedDate( $date )."</td><td>{$time}</td><td>{$place}</td><td>{$organizer}</td>{$formLink}</tr>"
}

function isNotFull($maxNum, $programId) {
    $marketoProgram = new MarketoProgram(); //  
    $marketoProgram->id = $programId;  //  プログラムID
    $memberNum = $marketoProgram->countMembers();　//　取得したリード数のカウント
    return $maxNum > $memberNum ? true : false ;  //  指定した席数との比較
}


function getOmittedDate( $date ) {
        $datetime = new DateTime($date);
        $weekList = array("日", "月", "火", "水", "木", "金", "土");
        $w = $weekList[$datetime->format('w')];

        $fulldate = date('n月j日', strtotime($date)).'（'.$w.'）';
        return $fulldate;
}

class MarketoProgram{
        private $host = "myMarketoHost";
        private $clientId = "myCliantId";
        private $clientSecret = "myCliantSecret";
        public $id;


        public function countMembers() {
            $jsonData = $this->getData();
            $data = json_decode($jsonData, false);
            return count($data->result);
        }

        
        public function getData(){
            // プログラムIDをキーに関連を持つリード（＝プログラムのメンバー）を取得
            // リードデータベースから引っ張る。そのためにプログラム内のメンバーが少なくても、リード全体の数が多いと重くなる？。<- 今の問題
            $url = $this->host . "/rest/v1/leads/programs/" . $this->id . ".json?access_token=" . $this->getToken(); 
            $ch = curl_init($url);
            curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('accept: application/json',));
            $response = curl_exec($ch);
            return $response;
        }
        
        private function getToken(){
            $ch = curl_init($this->host . "/identity/oauth/token?grant_type=client_credentials&client_id=" . $this->clientId . "&client_secret=" . $this->clientSecret);
            curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('accept: application/json',));
            $response = json_decode(curl_exec($ch));
            curl_close($ch);
            $token = $response->access_token;
            return $token;
        }
}
```

## 苦労した？点
Marketoに関する知識がまだ少ないために、欲しい情報の的確な名称がわからなかったり、見るべき箇所がわからない。
例えば、リードの呼び方が「顧客」であったり、プログラムでの「メンバー」であったりと安定していない。

こうしたことも影響し、当初は各プログラムごとのメンバーなり、フォーム受付結果の情報がプログラムやキャンペーンから情報を取得できるかと思っていた。実際はそれらのメタデータのみで、結果等は取得できなかった。
（もしもここから結果の情報が取れるのであれば、ぜひそこについて知りたい）

結局下記を参考にリードベースからプログラムに関連するデータを取得することができた。
<https://stackoverflow.com/questions/28468805/get-programs-and-their-members-and-status-with-marketo-api>

<https://developers.marketo.com/rest-api/endpoint-reference/lead-database-endpoint-reference/#!/Leads/getLeadsByProgramIdUsingGET>


また、純粋なプログラマーではないため（これまでも、そしてきっとこれからも）、プログラミングの知識も多くは持っていなく、単純な技術力の少なさがネック。
＊記法がcamelだったり、 snakeだったりするのは、ほ恥ずかしいけど、修正がめんどうなため放置。


## 今の問題点と改善方法の募集
リードデータベースから該当のプログラムに関連する情報を取得してきているために（？）、
リード全体が多いとデータを取得するまでに時間がかかってしまう。

弊社では現在およそ6万のリードがある。
一覧ページ1枚の中にフォームへのリンクは40ほどだが、それら40のリンクを表示させるか、させないかをチェックするのに40週も6万件のリードデータベースをまわることになる。
リード情報が多くなればなるほど、反応が遅くなってしまうことが問題。


# 追記
↑ 問題解決済み
一覧ページではキャンペーン人数を読み込むことはせず、すべての申込みリンクを一旦一つのリダイレクト用にページにし、その中でプログラムを動かすことでリードデータベースを回る回数は1回で済む。
リード数が極端に多くなれば結局その1回分も長くなってしまう問題にはぶち当たるが。。。当分先だと思われる。

改良後のプログラムのサンプルコード
https://github.com/jantyran/close_mkto_campaign_link