foundation5とCakephpで作るAjaxメールフォーム Controller編

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編に続く

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

foundation5とCakephpで作るAjaxメールフォーム Controller編の記事にコメントを投稿