Web

Zend_Viewの呼び出し方の流れ

  1. Zend_Viewクラスをインスタンス化 -> new演算子でZend_Viewオブジェクトを生成する
  2. ビュースクリプトのパスを設定 -> setScriptPath?メソッドで格納場所(&ビュースクリプトの検索場所)を設定する
    1. addScriptPath?でパスを追加することも可能。後に追加された場所が優先される
    2. setBasePath?
  3. ビュー変数の定義
  4. ビュースクリプトの呼び出し&レンダリング
    Zend_View;;render($name) #renderメソッド構文

ViewRender?ヘルパー

ビューオブジェクトの生成からパスを設定、レンダリングまでを自動化

特定のアクション内での自動レンダリングを無効

$this->helper->viewRenderer->setNoRender();

※別のアクションに転送された場合は、レンダリングは有効になるので注意

全アクションで自動レンダリングを無効

$this->helper->ViewRenderer->setNeverRender();

Zend_View_Interface

Zend_Viewへのサードベンダーのテンプレートエンジンを埋め込むための最低限の機能を実装

ViewRenderer?ヘルパー

setViewBasePathSpec?($path)ビュースクリプト検索時の基底パス:moduleDir/views
setViewScriptPathSpec?($Path)ビュースクリプトのパス(基底パスを除いたもの):controller/:action.:suffix
setViewScriptPathNoControllerSpec?($path)ビュースクリプトのパス(setNoController?/setNeverController? メソッドのコール時。基底パスを除いたもの:action.:suffix
setViewSuffix?($suffix)ビュースクリプトの拡張子phtml

:名前はプレイスフォルダー

:moduleDirモジュールの基底フォルダ
:moduleモジュール名setViewScriptPathSpec?
:controllerコントローラ名setViewScriptPathSpec?
:actionアクション名setViewScriptPathSpec?
:suffixビュースクリプトの拡張子setViewSuffix?

/mymod/mycon/myact/というURIがリクエストされると
smarty/mymod/mycon/myact.tplというビュースクリプトを読み出される

./application/smarty:module/:controller/:action.:suffix
setViewBasePathSpec?setViewScriptPathSpec?

Smartyを直接呼び出す場合 public function simpleAction(){

	$this->helper->viewRenderer->setNoRender()';
	require_once 'Smarty/Smarty.class.php';
	$s = new Smarty();
	$s->template_dir = APP.'/smarty/templates/';
	$s->compile_dir = APP.'/smarty/templates_c';
	$s->assign('result', 'hello world!');
	$s->display('default/smarty/index.tpl');

}

Zend_Layout

テンプレート機能を提供

流れ

  1. Zend_Layout利用の準備をする
    <?php
    define('APP', ';/application');
    require_once 'Zend/Controller/Front.php';
    require_once 'Zend/Layout.php';
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(APP.'/controllers');
$layout = Zend_Layout::startMvc( #Zend_Layoutを初期化
	array(
	'layoutPath'=>APP.'./view',
	'layout'=>'master',
	'contentKey'=>'content'
	)
);
$front->dispatch();
?>

Zend_Layout::startMvc($option)

layout使用するレイアウトスクリプトのベース名layout
layoutPathレイアウトスクリプトの基底パス
contentKeyコンテンツを格納したビュー変数content
mvcSucessfuleActionOnly?例外発生時はレイアウトをレンダリングしないか?True
viewレンダリングに使用するビューオブジェクトViewRenderer?指定のオブジェクト
helperClassZend_Layoutが使用するアクションヘルパーZend_Layout_Controller_Action_Helper_Layout
pluginClassZend_Layoutが使用するプラグインZend_Layout_Controller_Plugin_Layout
inflectorレイアウトスクリプトのパスを解決するために使用するインフレクタ
  1. レイアウトスクリプトを定義する
    #master.phtml
    <html>・・・
    <?php print($this->layout()->content); ?> #コンテンツを埋め込むプレイスフォルダ
    ・・・</html>
    $this->layout()->コンテンツキー
  2. Zend_Layoutの挙動を確認する

Zend_Layoutをアクションメソッドから操作する

レイアウトスクリプトを除外する

$this->helper->layout->disableLayout(); #レイアウトスクリプトを除外

$this->helper->layout->メソッド名();

レイアウトスクリプトを差し替える

特定のアクションでのみレイアウトスクリプトを差し替えることも可能

$this->helper->layout->setLayout('master2');

setLayoutメソッドには拡張子を除いたレイアウトスクリプトのベース名を指定する

Zend_View_Smarty

Zend_View_SmartyをZend_Layout対応にする

  1. Zend_View_SmartyクラスをZend_Layout対応にする
    <?php
    require_once 'Smarty./Smarty.class.php';
    require_once 'Zend/View/Interface.php';
    require_once 'Zend/View/Helper/Placeholder.php';
 class Zend_View_Smarty implements Zend_View_Interface {
 ~略~
 $holder = new Zend_View_Helper_Placeholder(); #プレイスフォルダーヘルパーが保持するコンテンツ情報を取得
 $data = $holder->placeholder('Zend_Layout')->getArrayCopy(); #同上
 $this->view->assign('content', $data['content']);  #コンテンツ情報をビュー変数contentに割り当て
 return $this->_view->fetch($name);
 }
 ~略~
}
  1. Zend_Layout利用の準備をする
    1. レイアウトスクリプトの拡張子を指定する
      $layout->setViewSuffix('tpl');
    2. HTMLエスケープを除外する
      Zend_View_Smartyクラスはディフォルトで埋め込みコンテンツをHTMLエスケープしてしますので、{$content|smarty:nodefaults}とする
  2. Zend_Layoutの挙動を確認

Zend_Validator

入力値の検証処理を行う。

Zend_Validator_XXXクラス(検証クラス)を提供している

名称概要引数
Alnum英数字のみか$allowWhiteSpace?(空白文字を許可するか)
Alpha英字のみか$allowWhiteSpace?
Between数値が指定範囲内か$min(最小値)、$max(最大値), $inclusiv(指定値を含むか)
Ccnum妥当なクレジット番号か
Data妥当な日付か(YYYY-MM-DD形式)$format日付フォーマット、$localeローケル
Digits数字のみか
EmailAddress?妥当なメールアドレスか$allow許可する種類、$validateMx MXチェックを行うか、$hostnameValidator 使用するホストバリデータ
Float浮動少数点値か
GreaterThan?指定値より大きいか$min
Hex16進法値か
HostName?適当なホスト名か$allow 許可するホスト名の種類、$validateldn 国際化ドメインを妥当をみなすか、 $validateTld トップレベルドメインをチェックするか、$ipValidator 使用っするIpバリデータ
InArray?配列内に指定値が存在するか$haystack 比較する配列、$strict 厳密に区別するか
Int 整数値
Ip妥当なIPアドレスか
LessThan?指定値より小さいか$max
NotEmpty?空ではないか
Regex正規表現パターンに合致するか$pattern
StringLength?文字列長が指定範囲内か$min, $max

使い方

<?php
require_once 'Zend/Validate/Int.php';
require_once 'Zend/Validate/GreaterThan.php';
$num = 10.5;
$val = new Zend_Validate_int(); #Zend_Validate_Intクラスをインスタンス化
if(!$val->isValid($num)){ #変数$numを検証し、エラーを検出した場合はエラーメッセージを順に出力
	foreach($val->getMessage() as $msg ) {print($msg.'<br />');}
}

  $val2 = new Zend_Validate_GreaterThan?(20); #Zend_Validate_GreaterThan?クラスをインスタンス化

 if(!$val2->isValid($num)){ #変数#numを検証し、エラーを検出したら順次に出力
	foreach($val2->getMessage() as $msg) {print($msg.'<br />');}

} バリデータクラスで実際に検証するのはisValidメソッド。引数に渡された値をそれぞれのルールで検証し、その結果をTrue/Falseで返す

検証クラスの使用注意点

  1. StringLength?検証クラス
    Zend_Validate_StringLength(0, 14); #0から14文字の範囲内かどうか
php.iniで iconv.internal_encoding = UTF-8 にしておく(ここの設定を使用する)
  1. Regex検証クラス
    内部的にpreg_match関数を使用している。
  2. InArray?検証クラス
    あらかじめ与えられた配列要素の中に入力文字列と合致すうr要素があるかどうか確認する
     require_once 'Zend/Validate/InArray.php';
     $str = 'struts'; #j検証対象の文字列
     $ary = array('symfony', 'Zend Framework', 'CakePHP', 'CodeIgniter'); #比較対象の配列(候補リスト)定義
 $val = new Zend_Validate_InArray($ary); #指定された配列$aryに$strが含まれているか確認
 if(!$val->isValid($str)){
	foreach($val->getMessage() as $msg) {print($msg.'<br />');}
 }
  1. HostName?検証
    new Zend_Validate_HostName($allow = Zend_Validate_Hostname::ALLOW_DNS, $validateIdn = True, $validateTld = True);
    $allowは許可するホスト名の種類 / ALLOW_ALL/ALLOW_DNS/ALLOW_IP/ALLOW_LOCAL
    $validateIdnは国際化ドメインを妥当とみなすかどうか
    $validateTldはトップレベルドメインをチェックするかどうか
  2. EmailAddress?検証クラス
    new Zend_Validate_EmailAddress($allow = Zend_Validate_HostName::ALLOW_DNS, $validateMx = False);

検証クラスのエラーメッセージ

Zend_Validate_Abstract::setMessage($msg, $key);
$msg はエラーメッセージ
$keyはメッセージキー

べりデータチェーン
検証クラスをチェーンのようなひとつらなりの塊として管理するための仕組みで、複数の検証処理をまとめて実行できるようになる

Zend_Validate::addValidator($validator, $break = false);

検証クラスの動作に必要な定数、変数

$_messageTemplatesエラーメッセージのテンプレート(キー=>メッセージ)の連想は入れる
$_messageVariablesテンプレートに埋め込み可能な変数(キー=>変数名)の連想配列

Zend_Filter

与えられたデータに対するフィルタ処理の機能を提供する

  • 入力から必要なものだけを抽出する機能
  • 特定の機能にしたがって変換する機能

Zend_Filter::get($value, $name, $args, $ns);

  • $valueはフィルタ対象の文字列
  • $name はフィルタ名
  • $argはフィルタの動作パラメーター
  • $nsは名前空間(ディフォルトはZend_Filter)

Zend_Filter_Xxxx::filter($value)
フィルタクラスをインスタンス化して、filterメソッドを明示的にコールする

フィルターチェーン

Zend_Filter::addFilter($filter)

?php

require_once 'Zend/Filter.php';
require_once 'Zend/Filter/Digit.php';
require_once 'Zend/Filter/Int.php';
$str = '身長は178です';
$chain = new Zend_Filter();
$chain->addFilter(new Zend_Filter_Digits())
	->addFilter(new Zend_Filter_Int());
print($chain->filter($str));

Zend_Filter_Input

  • Zend_Valite/Zend_Filterによって提供すうr手段を提供する
  1. 検証/フィルタリング規則を定義する
    arrayにいれるものが1つしかなくても連想配列で設定する
  2. 検証/フィルタリングのためのZend_Filter_Inputオブジェクトを生成する
  3. 検証/フィルタリング処理を実施
  4. 処理結果(入力値またはエラーメッセージ)を取得

検証/フィルタリング規則を連想配列で定義する

isValidメソッド

  • 与えられた値がすべて検証規則を通過したかどうかをしらべtrue/falseで返す

hasXxxxメソッド

  • 無効なフィールド、存在しないフィールド、未知のフィールドの有無を個別に確認する
  • hasInvalid/HasMissing?/hasUnknownメソッド

getXxxxxメソッド

  • 検証/フィルタリングの結果を取得する
getEscaped($name)有効なフィード名(エスケープ済み)
getUnescaped($name)有効なフィード名(エスケープ前)
getInValid?()無効なフィード名
getMissing()存在しないフィード名
getMessages()無効、存在しないフィールド値
getUnknown()未知のフィールド値
getErrors()エラー情報

メタコマンド

Zend_Filter_Inputクラスの動作を制御するオプション

エラーメッセージの一元化管理

?php class MyMsg? {

	const ALNUM = '%value%は英数字のみで指定してください。';
	const ALNUM2 = '%value%は必ず入力してください。";
	const ALNUM3 = '%value%は英字のみでっ指定してください';

}

Zend_Filter_Input::MESSAGE =>MESSAGE => array(

	MyMsg::INT;
	MyMsg::BETWEEN

Last-modified: 2012-03-12 (月) 17:05:13 (166d)