ホーム > 日記 > Ethnaのフォーム定義をyamlで書く

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);
    } 

カテゴリー: 日記 タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。