ControllerでAjaxリクエストの判定とvalidation処理を行う
メールフォームのURLを決める
Controllerでは、主にAjaxリクエストの判定とvalidationの判定がメインタスクになります。
通常のリクエストとAjaxリクエストを一つのアクション内で処理できるようにして、さらにAjaxリクエストの場合は、モデルのvalidation機能を利用して結果がNGの場合には、Ajaxリクエストの結果としてHTTPエラーを返すようにします。
コントローラの内容に入る前に、メールフォーム(問い合わせフォーム)のURLを決めたいと思います。Cakephpのインストールで設定した
http://cakephp.local/contact
というURLでメールフォームにアクセスできるようにします。そのためには、Cakephpのルーターを設定する必要があります。
app\Config\routes.php
というルーティング設定ファイルに以下のコードを追加します。
Router::connect( '/contact', array( 'controller' => 'pages', 'action' => 'contact' ) );
/contactへのアクセスをCakephpのPagesController内contactアクションにマッピングするコードになります。上の設定をすることで、/contactでアクセスできるようになりますが、そのためには適切にcontactアクションを用意しておかなければなりません。
コントローラの準備
PagesController.phpを開いて、メールフォームに必要な以下の設定を追加していきます。
まずModel編で準備したContactモデルを利用できるように以下のように設定します。
public $uses = array( 'Contact' );
CakephpのJs helperを利用しますので、以下のように設定します。js helperはview側で利用することになり、ajax関連のjavascriptコードを効率的に書くことができるツールです。
public $helpers = array( 'Js' );
以下2つのコンポーネントも読み込んでおきます。RequestHandlerコンポーネントは、Ajaxリクエストの判定に利用できる機能を提供するもので、RSSファイルに対するリクエストの判定やPOSTメソッドの判定などにも利用されます。Emailコンポーネントも読み込んでおきます。
public $components = array( 'RequestHandler', 'Email' );
アクションの定義
contactアクションは以下のようになります。
public function contact() { if( !$this->request->is('ajax') ) //Ajaxリクエストではなく通常のリクエスト { $this->set('title_for_layout', "メールフォーム - Webエンジニアブログ"); $this->set('title_for_h1', "お問い合わせ"); } else //Ajaxリクエスト { //POSTで渡されないデータの補足処理 $this->request->data['Contact']['ip_address'] = getenv("REMOTE_ADDR"); $this->request->data['Contact']['created'] = date('c'); //view(element)にデータを渡す $this->set('data', $this->request->data['Contact']); if( $this->Contact->save(h($this->data)) ) //validationがOKの場合 { $this->render('/Elements/Ajaxs/ajaxupdated_contact', 'ajax'); //Ajaxリクエストで得られるHTML } else //validationがNGの場合 { $this->set('valerror', $this->Contact->validationErrors); //エラーメッセージをview(element)に渡す $this->response->statusCode(400); //Ajaxリクエストに対してHTTPエラーを返す $this->render('/Elements/Ajaxs/ajaxupdated_contact', 'ajax'); //Ajaxリクエストで得られるHTML return; } } }
冒頭でも書いたとおり、
・Ajaxリクエストの判定
・Ajaxリクエストの場合は、モデルのバリデーション判定
上の2つが主なタスクです。
view編では、js helperを利用してjavascriptのコードを生成します。View編に続く