SHOEISHA iD

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

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

Zend Framework入門

Zend Framework入門(9):
Zend Frameworkにおけるビューの処理 - Zend_View(前編) -

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

具体的なプレースホルダ

 この他に、いくつかのプレースホルダのサブクラスが提供されています。これらは情報を保持するだけではなく、出力する際に保持している情報に特別な加工を行います。

具体的なプレースホルダ
プレースホルダ名 説明
Doctype ドキュメントの種類('XHTML1_STRICT'等)を保持するためのプレースホルダ。
HeadTitle ドキュメントのタイトルを保持するためのプレースホルダ。
HeadLink ドキュメントのヘッダーのLINK要素を保持するためのプレースホルダ。
HeadMeta ドキュメントのヘッダーのMETA要素を保持するためのプレースホルダ。
HeadScript ドキュメントのヘッダーに設置したスクリプトを保持するためのプレースホルダ。
HeadStyle ドキュメントのヘッダーのSTYLE要素を保持するためのプレースホルダ。
InlineScript ドキュメントの中に埋め込まれたスクリプトを保持するためのプレースホルダ。
JSON JSON形式で出力したい情報を保持するためのプレースホルダ。
Translate 言語間の単語の対応を保持するためのプレースホルダ。

 これらについての例を見ていきましょう。サンプルではコントローラスクリプトで設定したプレースホルダをスクリプトで使っています。

 まずヘッダまわりのものを見てみましょう。ここではheadTitleプレースホルダ、HeadScriptプレースホルダ、InlineScriptプレースホルダを利用しています。

具体的なプレースホルダの例(1)ヘッダーまわり
IndexController.php内:
class IndexController extends Zend_Controller_Action
{
    public function init()
    {
...
       //タイトルの先頭に加える(1)
       $this->view->headTitle('Zend_View: ', 'PREPEND');

...
       //スクリプトの設定(2)
       $this->view->HeadScript()->appendFile('/js/currenttime.js'); 
       $this->view->InlineScript()
            ->appendScript('setInterval("updateTime()", 1000);');

index.phtml 内:
<?php
  $this->placeHolder('title')->set('簡単なメモ');//(3)
  echo $this->Doctype('XHTML1_STRICT'); //(4)
  //echo $this->Doctype('HTML4_LOOSE');
?>

<html>
<head>
<?php echo $this->headTitle($this->placeHolder('title')); ?>
<?php echo $this->HeadScript(); //(5) ?>
</head>
<body>
<h1><?php echo $this->placeHolder('title') ?></h1>
...
<h3>上の内容をHTMLにしたもの</h3>
<?php echo $this->preHelper($this->placeHolder('memosList')) ?>
<?php echo $this->InlineScript(); //(6) ?>
HeadTitle

 HeadTitleはhtmlヘッダの中にあるtitleタグを出力するためのプレースホルダです。HeadTitleではタイトルの前と後に表示する文字列を追加することができます。記法はview->headTitle(加える内容, 加える位置)で、加える位置を省略可能するとタイトルの後に追加されます。例の(1)のように、'PREPEND'というキーワードを利用すると、タイトルの先頭に追加できます。図の(3)ではタイトルの内容を加えた上で表示を行っています。

HeadScript、InlineScript

 HeadScript、InlineScriptは(JavaScriptなどの)スクリプトを格納するためのプレースホルダです。HeadScriptはHTMLのヘッダ内で宣言するスクリプト、InlineScriptはHTMLの内部で宣言するためのプレースホルダです。図の(2)にあるとおり、スクリプトをファイルから読み込むように設定する(appendFileメソッド)こともできますし、直接スクリプトの内容を文字列で指定して追加する(appendScriptメソッド)こともできます。

 どのように指定したスクリプトであっても図の(5)や(6)のように、通常のプレースホルダと同じように出力できます。

Doctype

 Doctypeはドキュメントのタイプを宣言するためのスクリプトです。図の(4)のように、スクリプトの先頭で呼び出して利用するのが普通です。Doctypeには次の種類を指定できます。

Doctypeで指定できるドキュメントの種類
XHTML1_STRICT, XHTML1_TRANSITIONAL, XHTML1_FRAMESET,
HTML4_STRICT, HTML4_LOOSE, HTML4_FRAMESET

 実は、Doctypeの内容により他のビューヘルパの挙動も変化します。1番分かりやすいのはDoctypeに指定されているのがXHTMLなのかHTMLなのかによる違いで、formTextなどの出力が変化します。また、自分の書いたスクリプトでXHTMLかどうか調べるにはDoctypeのisXhtmlメソッドを利用します。

DoctypeでXHTMLかどうかのチェック
class Zend_View_Helper_BrTag
{
...
    public function brTag()
    {
      $xhtml = "<br />\n";
      if (($this->view instanceof Zend_View_Abstract) &&
           !$this->view->doctype()->isXhtml()) {
              //XHTMLかどうか調べている
...
    }
}
translate

 translateプレースホルダは、Zend_Translateを利用して、言語設定に応じて出力を変化させるためのプレースホルダです。利用方法はいくつかありますが、あらかじめZend_Translateのインスタンスを登録しておく使い方が奨励されています。

具体的なプレースホルダの例(2)translate
IndexController.php内:
       //言葉の置き換え
       $adapter = new Zend_Translate('array', 
                                      array('submit' => '送信',
                                            'reset' => '全て消す'),
                                            'ja');
       Zend_Registry::set('Zend_Translate', $adapter);

inputForm.phtml内:
echo $this->formSubmit('', $this->translate('submit'));

 このように、translateプレースホルダを経由すると、あらかじめZend_Translateに登録されてる単語が置換されます。

JSON

 JSON形式でデータをやりとりする場合には、通常のデータのやりとりと、いくつか異なる点があります。

  • 通常の描画を行ってはならない
  • HTTPのヘッダで指定するドキュメントタイプが異なる

 jsonプレースホルダを利用すれば上の処理を自動的に行ってくれます。

具体的なプレースホルダの例(3)JSONを出力
<?php
  //json_encode は UTF-8 しか受け付けないので変換する
  $dateTimeMemosUTF8 = array();
  foreach ($this->dateTimeMemos as $dateTimeMemo) {
    foreach ($dateTimeMemo as $dateTime => $memo) {
      $key = mb_convert_encoding($dateTime, "UTF-8", "SJIS");
      $value = mb_convert_encoding($memo, "UTF-8", "SJIS");
      $dateTimeMemosUTF8[$key] = $value;
    }
  }

  //あとは JSONプレースホルダに渡すだけ
  echo $this->json($dateTimeMemosUTF8);

 なお、JSON形式に実際に変換しているのはPHPのjson_encode関数です。この関数はUTF-8でエンコードしたデータのみを受けつけるので、上の例ではmb_convert_encoding関数を利用して変換を行っています。

今回のまとめ

 今回は標準的なビューヘルパについて説明しました。次回は引き続き、ビューヘルパーを自作する方法、および、Zend FrameworkとSmartyを連携させる方法についての説明を行います。

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2842 2008/09/01 16:30

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング