SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

AJAX機能とのスムーズな連携 - Zend_Controllerの新しいアクションヘルパー -

Zend Frameworkによる実践的なPHPアプリケーション開発 31


ContextSwitchでコンテキストを自作する

 先程見たとおり、ContextSwitchには標準で2種類のフォーマットに対応していますが、これ以外にも自分でコンテキストを追加することもできます。例えばプレインテキストを出力するテスト用のコンテキスト「test」を追加するとしましょう。

 コンテキストを追加するには「addContext」メソッドを使います。

リスト6 コンテキストの追加
init()
{
  $contextSwitch = $this->_helper->getHelper('contextSwitch');
...
  /* コンテキストの作成と追加 */
  $contextSwitch->addContext('test', //(1) コンテキストの名前
                             array('suffix' => 'tst', //(2) 拡張子
                                   'headers' => array('content-type'
                                                      => 'text/plain') //(3)HTTPヘッダ
                                   ));
  $contextSwitch->addActionContext('context', 'test'); //(4)コンテキストをアクションに関連付け
...
  $contextSwitch->initContext();
}

 addContextメソッドは2つの引数を取ります。(1)コンテキストの名前と、(2)(3)オプションです。ここではコンテキストのオプションに(2)ビュースクリプトで使う拡張子と(3)レスポンスで返すHTTPヘッダを指定しています。

 この作成したコンテキストを(4)で「context」アクションに関連付けています。これで、contextアクションに「test」コンテキストでアクセスした場合には、今作成したコンテキストで処理されるようになります。

リスト7 テスト用のビュースクリプト(context.tst.phtml)
title: Context Switch example

Test

 ここでリスト7のようなビュースクリプトを準備すると、結果はリスト8のようになります。

リスト8 テスト用コンテキストの実行結果
http://~/index/context/format/test

 ▼

title: Context Switch example

Test

AJAXリクエストへの出力(AjaxContext)

 ContextSwitchアクションヘルパーを利用してJSON形式のデータを送信するアクションを作成していたとしましょう。このときは間違えてこのサービスに通常のブラウザでアクセスしてしまうと、ブラウザはJSON形式のデータをダウンロードしようとして、ダウンロード用のダイアログを表示してしまいます。

 これでは使い勝手が悪いので、AJAXのリクエストが来た場合のみにレスポンスを返すアクションヘルパーがAjaxContextアクションヘルパーです。

図2 AjaxContextとContextSwitchの違い
図2 AjaxContextとContextSwitchの違い

 AjaxContextアクションヘルパーはContextSwitchアクションヘルパーを継承したクラスで、ContextSwitchアクションヘルパーと似たような機能を備えていますがAJAXへのリクエストのみを処理します。また、通常のContextSwitchアクションヘルパーと、次のような違いがあります:

  • 通常のContextSwitchアクションヘルパーは、登録されたコンテキストを「contexts」プロパティで管理しますが、AjaxContextアクションヘルパーは「ajaxable」プロパティで管理します。そのため、通常のHTMLを処理するためのContexSwitchアクションヘルパーと共存が可能です。
  • AJAXなリクエストでなければ、フォーマット等の条件が一致していたとしてもAjaxContextアクションヘルパーは起動しません。これの判定は、HTTPリクエストのヘッダに「X-Requested-With: XMLHttpRequest」があるかどうかで判定しています。
  • AJAXのリクエストに対してHTML形式を送信するためのコンテキスト「HTML」が追加されています。このコンテキストに対応する拡張子は「ajax」です(つまり、対応するビュースクリプトの名前は「~.ajax.phtml」)。

 これで、1つのアクションでWebページを出力したり、AJAXへのレスポンスを返したりすることが可能になります。例えば、ギリシャ文字のリストを返す「ajax」コントローラの「items」アクションを考えてみます。リストの内容を通常のWebブラウザで確認したい場合はHTML形式で、オートコンプリート用のAJAXリクエストが来た場合にはJSON形式でレスポンスを返すとしましょう:

リスト9 1つのアクションでHTML形式とJSON形式でレスポンスを返す
class AjaxController extends Zend_Controller_Action
{
    public function init()
    {
        /* (1)AjaxContexの設定 */
        $contextSwitch = $this->_helper->getHelper('AjaxContext');

        $contextSwitch->addActionContext('items', 'json')//(1-1)
          ->initContext();
    }
...
    public function itemsAction()
    {
        $view = $this->view;

        /* (2)リストの準備 */
        /* データのキー */
        $view->assign('identifier', 'name');

        /* データの生成 */
        $data = array('alpha','beta','gamma','delta','epsilon','zeta');
        $items = array();
        foreach ($data as $datum) {
          $items[] = array('name' => $datum);
        }
        
        /* ビューの変数に割り振り */
        $view->assign('items', $items);
    }

 まず(1)initメソッド内でAjaxContextアクションヘルパーを設定しています。ここでは(1-1)でJSON形式のデータへのリクエストがあった場合にコンテキストを変更するように設定しています。次に(2)itemsアクションではギリシャ文字のリストの準備をしています。

 このajaxコントローラのitemsアクションにWebブラウザ等でアクセスすると、ビュースクリプトが実行されHTMLファイルが表示されます。一方で、JavaScript等からフォーマットを「JSON」に指定したリクエストが来ると、AjaxContextアクションヘルパーによってコンテキストが切り替わり、ビューに関連付けられた変数をJSON形式で送信します。

 一方で、通常のHTTPリクエストで「http://~/ajax/items/format/json」へアクセスしてもコンテキストの切り替えは起きません。コンテキストの切り替えを起こすためにはHTTPのヘッダに手を入れる必要があります。例えば「wget」という、コマンドラインからHTTPリクエストを行うツールを使い、リクエストのヘッダに「X-Requested-With: XMLHttpRequest」を追加してみます:

リスト10 JSON形式でレスポンス(AjaxContextアクションヘルパー)
$wget -qO- --header="X-Requested-With: XMLHttpRequest"  http://localhost/ajax/items/format/json

 ▼

{"identifier":"name","items":[{"name":"alpha"},...{"name":"zeta"}]}

 このように、リクエストヘッダに「X-Requested-With: XMLHttpRequest」が入っていれば出力もJSON形式になります。

次のページ
おわりに

この記事は参考になりましたか?

Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5631 2011/01/07 16:20

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー