Ethnaのフォーム定義をyamlで書く
アクションフォーム毎に設定とか糞なのでプロジェクトのアクションフォームに設定するように。
せっかくなのでプラグイン化。
yamlファイルはetc以下におくことにしました
元になるフォーム定義はこれ
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□ 1.{appid}/libにspycの0.3betaをインストール
□2□ {appid}/etcにアクションフォームのクラス名小文字.yaml(今回はsample_form_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:
□3□ {appid}/app/pluginに以下のファイルを作る
Lowtech_Plugin_Parser.php
<?php
/**
* Lowtech_Plugin_Parser.php
*
* @author cockok <cockok@cheki.net>
* @package Lowtech
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @version $id$
*/
/**
* Lowtech_Plugin_Parser
*
* @author cockok <cockok@cheki.net>
* @package Lowtech
* @version $id$
*/
class Lowtech_Plugin_Parser
{
/** @var object Ethna_Controller コントローラオブジェクト */
var $controller;
/**
* Lowtech_Plugin_Parserのコンストラクタ
*
* @param object Ethna_Controller $controller コントローラオブジェクト
* @access public
* @return void
*/
function Lowtech_Plugin_Parser(&$controller)
{
$this->controller =& $controller;
}
/**
* Lowtech_Plugin_Parserのコンストラクタ
*
* @param string $path 対象のパス
* @access public
* @return Ethna_Error object
*/
function load($path)
{
return Ethna::raiseError('override!');
}
}
?>
Parser/Lowtech_Plugin_Parser.php
<?php
/**
* Lowtech_Plugin_Loader_Yaml.php
*
* @author cockok <cockok@cheki.net>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @package Lowtech
* @version $id$
*/
/**
* spyc 0.3beta
* http://spyc.sourceforge.net/
*/
if (substr(PHP_VERSION, 0, 1) >= 5) {
require_once 'spyc/spyc.php5';
} else {
require_once 'spyc/spyc.php';
}
/**
* Lowtech_Plugin_Parser_Yaml
*
* @author cockok <cockok@cheki.net>
* @package Lowtech
* @version $id$
*/
class Lowtech_Plugin_Parser_Yaml extends Lowtech_Plugin_Parser
{
/**
* Lowtech_Plugin_Parserのコンストラクタ
*
* @param string $path 対象のパス
* @access public
* @return mixed failed Ethna_Error
*/
function load($path)
{
// ファイルの更新日時の取得
clearstatcache();
if (is_readable($path) === false
|| ($st = stat($path)) === false) {
return Ethna::raiseNotice('fopen failed ' . $path);
}
$mtime = $st[9];
// キャッシュキーの作成
$key = md5($path);
// キャッシュマネージャ
$plugin =& $this->controller->getPlugin();
$cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
// 更新日時以降のキャッシュをチェック
if ($cache_manager->isCached($key)
&& $mtime < $cache_manager->getLastModified($key)) {
// キャッシュがヒット
$r = $cache_manager->get($key);
} else {
// 有効なキャッシュが見つからなかった
$r = Spyc::YAMLLoad($path);
// データをキャッシュする
$cache_manager->set($key, $r);
}
return $r;
}
}
?>
□4□ コントローラの$plugin_search_appidsに利用するアプリケーションID(Lowtech)を追加
$plugin_search_appids = array(
'{appid}', 'Lowtech', 'Ethna',
);
□5□ アクションフォームのコンストラクタをオーバーライド
function {appid}_Form_Login(&$controller)
{
// yamlプラグイン
$plugin =& $controller->getPlugin();
$loader =& $plugin->getPlugin('Parser', 'Yaml');
// form値の上書き
$r = $loader->load(BASE . '/etc/' . strtolower(get_class($this)) . '.yaml');
if (!Ethna::isError($r)) {
$this->form = $r;
}
// type, form_typeの定数を補正
$constants = get_defined_constants();
foreach ($this->form as $name => $value) {
foreach ($this->def as $k) {
if (isset($value[$k]) && in_array($k, array('type', 'form_type'))
&& array_key_exists($value[$k], $constants)) {
$this->form[$name][$k] = $constants[$value[$k]];
}
}
}
// オーバーライド
parent::Ethna_ActionForm($controller);
}
カテゴリー: 日記