Web
Zend_Viewの呼び出し方の流れ †
- Zend_Viewクラスをインスタンス化 -> new演算子でZend_Viewオブジェクトを生成する
- ビュースクリプトのパスを設定 -> setScriptPath?メソッドで格納場所(&ビュースクリプトの検索場所)を設定する
- addScriptPath?でパスを追加することも可能。後に追加された場所が優先される
- setBasePath?
- ビュー変数の定義
- ビュースクリプトの呼び出し&レンダリング
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 †
テンプレート機能を提供
流れ
- 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?指定のオブジェクト |
helperClass | Zend_Layoutが使用するアクションヘルパー | Zend_Layout_Controller_Action_Helper_Layout |
pluginClass | Zend_Layoutが使用するプラグイン | Zend_Layout_Controller_Plugin_Layout |
inflector | レイアウトスクリプトのパスを解決するために使用するインフレクタ | |
- レイアウトスクリプトを定義する
#master.phtml
<html>・・・
<?php print($this->layout()->content); ?> #コンテンツを埋め込むプレイスフォルダ
・・・</html>
$this->layout()->コンテンツキー
- 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対応にする
- 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);
}
~略~
}
- Zend_Layout利用の準備をする
- レイアウトスクリプトの拡張子を指定する
$layout->setViewSuffix('tpl');
- HTMLエスケープを除外する
Zend_View_Smartyクラスはディフォルトで埋め込みコンテンツをHTMLエスケープしてしますので、{$content|smarty:nodefaults}とする
- 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 |
Hex | 16進法値か | |
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で返す
検証クラスの使用注意点
- StringLength?検証クラス
Zend_Validate_StringLength(0, 14); #0から14文字の範囲内かどうか
php.iniで iconv.internal_encoding = UTF-8 にしておく(ここの設定を使用する)
- Regex検証クラス
内部的にpreg_match関数を使用している。
- 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 />');}
}
- 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はトップレベルドメインをチェックするかどうか
- 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手段を提供する
- 検証/フィルタリング規則を定義する
arrayにいれるものが1つしかなくても連想配列で設定する
- 検証/フィルタリングのためのZend_Filter_Inputオブジェクトを生成する
- 検証/フィルタリング処理を実施
- 処理結果(入力値またはエラーメッセージ)を取得
検証/フィルタリング規則を連想配列で定義する
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