アクションフォームのフォーム値をyamlで書きたい!
アクションフォームのフォーム値をyamlで書きたいとは配列好きなので思ったことなかったのですが、PHP勉強会でEthnaの話題がでるということで半年振りくらいに触ってみる。
半年振りでも変わらないEthnaステキ!
yamlファイルはアクションと同ディレクトリに小文字ファイル名で。
これが元。
class Sample_Form_Login extends Sample_ActionForm
{
/** @var bool バリデータにプラグインを使うフラグ */
var $use_validator_plugin = true;
/**
* @access private
* @var array フォーム値定義
*/
var $form = array(
'login_id' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'name' => 'ログインID',
'required' => true,
),
'password' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_PASSWORD,
'name' => 'パスワード',
'required' => true,
),
'login' => array(
),
);
1.lib以下にspycの3.0betaぶち込む
2.コントローラでrequire
/** アプリケーションライブラリのインクルード */
require_once 'Ethna/Ethna.php';
require_once 'Sample_Error.php';
require_once 'Sample_ActionClass.php';
require_once 'Sample_ActionForm.php';
require_once 'Sample_ViewClass.php';
require_once 'spyc/spyc.php';
//require_once 'spyc/spyc.php5';
3.アクションと同位置にファイル名.yaml(今回はlogin.yaml)を作成
login_id:
type: VAR_TYPE_STRING
form_type: FORM_TYPE_TEXT
name: ログインID
required: true
password:
type: VAR_TYPE_STRING
form_type: FORM_TYPE_PASSWORD
name: パスワード
required: true
login:
4.アクションフォームのコンストラクタをオーバーライド
function Sample_Form_Login(&$controller)
{
parent::Sample_ActionForm($controller);
$yaml_path = dirname(__FILE__).DIRECTORY_SEPARATOR.strtolower(substr(basename(__FILE__), 0, -3)).'yaml';
// キャッシュマネージャ
$plugin =& $this->backend->getPlugin();
$cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
// キャッシュKeyの設定
$cache_key = md5($yaml_path);
// このKeyに対する有効なキャッシュの確認
if ($cache_manager->isCached($cache_key)) { // キャッシュがヒット
$this->form = $cache_manager->get($cache_key);
} else { // 有効なキャッシュが見つからなかった
$this->form = Spyc::YAMLLoad($yaml_path);
// 省略値補正
$constants = get_defined_constants();
foreach ($this->form as $name => $value) {
foreach ($this->def as $k) {
if (isset($value[$k]) == false) {
$this->form[$name][$k] = null;
}
// type, form_typeの補正
if (isset($value[$k]) && in_array($k, array('type', 'form_type'))
&& array_key_exists($value[$k], $constants)) {
$this->form[$name][$k] = $constants[$value[$k]];
}
}
}
// データをキャッシュする
$cache_manager->set($cache_key, $this->form);
}
}
カテゴリー: 日記