Top > MyPage
 

Ethna探検記

Ethna探検記

Install

Windowsの場合を記す。

PHPはすでにインストールされていて、go-pear.batにしっかりパスが通っているとして、

$ go-pear

と打ち込んで、コンソールに出てきた設定でOKならそのまま、リターン。次に、

$ pear channel-discover pear.ethna.jp

$ pear install ethna/ethna

で終了。アーカイブからインストールしたい場合は

<URL:http://ethna.jp/ethna-document-tutorial-install_guide.html>

を参考に。

ただし、SmartyとPEAR::DBがインストールされている必要があるので、インス トールされていない場合は

$ pear install PEAR/DB

でDBを、http://smarty.php.net/からSmartyをダウンロードしてきて、適当の 場所に解凍し、libsディレクトリーをSmartyという名前に変え、これをphpの 検索パス以下にコピーする。僕の場合は

c:\xampp\php\includes\Smarty

のようにコピー。

そしてphp.iniのインクルードパスにそのディレクトリーを追加 する。

\xampp\php\includes\Smarty

	  include_path = ".;\xampp\php\pear\;\xampp\php\includes\"
	

という感じ。

サンプルアプリケーションの作成

基本的には、

<URL:http://ethna.jp/ethna-document-tutorial-practice1.html>

を参考にしています。

アプリケーション情報の決定

  1. アプリケーションID(英字のみ) 今回:kaigi
  2. アプリケーション配置ディレクトリ(どこでもOK) 今回:c:\appli

スケルトンの作成

Dosプロンプトで、

$ cd c:\appli

で、配置ディレクトリーに移って(行かなくてもOKみたい)

ethna add-project -b=c:/appli kaigi

とすると

C:\xampp\php>ethna add-project -b=c:/appli kaigi
creating directory (C:\appli/kaigi) [y/n]: y
project sub directory created [C:\appli/kaigi/app]
project sub directory created [C:\appli/kaigi/app/action]
project sub directory created [C:\appli/kaigi/app/action_cli]
project sub directory created [C:\appli/kaigi/app/action_xmlrpc]
project sub directory created [C:\appli/kaigi/app/filter]
project sub directory created [C:\appli/kaigi/app/plugin]
project sub directory created [C:\appli/kaigi/app/plugin/Filter]
project sub directory created [C:\appli/kaigi/app/plugin/Validator]
project sub directory created [C:\appli/kaigi/app/view]
project sub directory created [C:\appli/kaigi/bin]
project sub directory created [C:\appli/kaigi/etc]
project sub directory created [C:\appli/kaigi/lib]
project sub directory created [C:\appli/kaigi/locale]
project sub directory created [C:\appli/kaigi/locale/ja]
project sub directory created [C:\appli/kaigi/locale/ja/LC_MESSAGES]
project sub directory created [C:\appli/kaigi/log]
project sub directory created [C:\appli/kaigi/schema]
project sub directory created [C:\appli/kaigi/skel]
project sub directory created [C:\appli/kaigi/template]
project sub directory created [C:\appli/kaigi/template/ja]
project sub directory created [C:\appli/kaigi/tmp]
project sub directory created [C:\appli/kaigi/www]
project sub directory created [C:\appli/kaigi/www/css]
project sub directory created [C:\appli/kaigi/www/js]
file generated [C:\xampp\php\PEAR\Ethna/skel/www.index.php -> \
    C:\appli/kaigi/www/index.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/www.info.php -> \
    C:\appli/kaigi/www/info.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/www.unittest.php -> \
    C:\appli/kaigi/www/unittest.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/www.xmlrpc.php -> \
    C:\appli/kaigi/www/xmlrpc.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/www.css.ethna.css -> \
    C:\appli/kaigi/www/css/ethna.css]
file generated [C:\xampp\php\PEAR\Ethna/skel/dot.ethna -> \
    C:\appli/kaigi/.ethna]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.controller.php -> \
    C:\appli/kaigi/app/Kaigi_Controller.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.error.php -> \
    C:\appli/kaigi/app/Kaigi_Error.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.actionclass.php -> \
    C:\appli/kaigi/app/Kaigi_ActionClass.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.actionform.php -> \
    C:\appli/kaigi/app/Kaigi_ActionForm.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.viewclass.php -> \
    C:\appli/kaigi/app/Kaigi_ViewClass.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.action.default.php -> \
    C:\appli/kaigi/app/action/Index.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.plugin.filter.default.php \
    -> \
    C:\appli/kaigi/app/plugin/Filter/Kaigi_Plugin_Filter_ExecutionTime.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.view.default.php -> \
    C:\appli/kaigi/app/view/Index.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.unittest.php -> \
    C:\appli/kaigi/app/Kaigi_UnitTestManager.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/app.url_handler.php -> \
    C:\appli/kaigi/app/Kaigi_UrlHandler.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/etc.ini.php -> \
    C:\appli/kaigi/etc/kaigi-ini.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.action.php -> \
    C:\appli/kaigi/skel/skel.action.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.action_cli.php -> \
    C:\appli/kaigi/skel/skel.action_cli.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.action_test.php -> \
    C:\appli/kaigi/skel/skel.action_test.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.app_object.php -> \
    C:\appli/kaigi/skel/skel.app_object.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.entry_www.php -> \
    C:\appli/kaigi/skel/skel.entry_www.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.entry_cli.php -> \
    C:\appli/kaigi/skel/skel.entry_cli.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.view.php -> \
    C:\appli/kaigi/skel/skel.view.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.template.tpl -> \
    C:\appli/kaigi/skel/skel.template.tpl]
file generated [C:\xampp\php\PEAR\Ethna/skel/skel.view_test.php -> \
    C:\appli/kaigi/skel/skel.view_test.php]
file generated [C:\xampp\php\PEAR\Ethna/skel/template.index.tpl -> \
    C:\appli/kaigi/template/ja/index.tpl]

project skelton for [kaigi] is successfully generated at [C:\appli]
	  

というような、長いメッセージを吐いて、スケルトンが沢山出来る。

index.phpのコピー(LinuxならリンクでもOK)

C:/appli/kaigi/www/index.php

を、xamppのドキュメントルート以下の

C:/xampp/htdocs/kaigi

にコピーする。

同様に、

C:/appli/kaigi/www/js

C:/appli/kaigi/www/css

ディレクトリーごと

C:/xampp/htdocs/kaigi

以下にコピーする。

確認

xampp(apache)を立ち上げて、http://localhost/kaigi/

にアクセスすると、一応「Index Page」といようなページが見ることができる。

ディレクトリー構造

kaigi以下のディレクトリーは以下のようになっている。

+----app         (アプリケーションのスクリプト)
|    |
|    +----action (アクションスクリプト)
|    |
|    +----action_cli (CLI用アクションスクリプト)
|    |
|    +----action_xmlrpc (XMLRPC用アクションスクリプト)
|    |
|    +----filter (フィルタスクリプト)
|    |
|    +----view   (ビュースクリプト)
|
+----bin         (コマンドラインスクリプト)
|
+----etc         (設定ファイル等)
|
+----lib         (アプリケーションのライブラリ)
|
+----locale
|    |
|    +-----ja
|          |
|          +----LC_MESSAGES (メッセージカタログ)
|
+----log         (ログファイル)
|
+----schema      (DBスキーマ等)
|
+----skel        (アプリケーション用スケルトンファイル)
|
+----template
|    |
|    +----ja     (テンプレートファイル)
|
+----tmp         (一時ファイル)
|
+----www         (ウェブサーバ用ファイル)
     |
     +----css    (CSSファイル)
     |
     +----js     (JavaScriptファイル)
	  

とりあえず使うのは、

  • appディレクトリ
  • app/actionディレクトリ
  • app/viewディレクトリ
  • template/jaディレクトリ

アクションクラスの作成

アクションクラスを作成する前に、次のことに留意する。

Controllerにアクションクラスの定義を書き込む

最初のスケルトンでは、何も定義していませんが(空)

var $action = array(
     /*
      *  TODO: ここにaction定義を記述してください
      *
      *  記述例:
      *
      *  'index'     => array(),
      */
);
	  

となっていて、空っぽになっています。ここに、例えば、

var $action = array(
     /*
      *  TODO: ここにaction定義を記述してください
      *
      *  記述例:
      *
      *  'index'     => array(),
      */
       'login'       => array(
       'class_name' => 'Kaigi_Action_Login',
);
	  

というにすると、ログインに対応するアクション名を Kaigi_Action_Loginとなります。

アクションクラスの定義の省略

上記のような定義をいちいち書くのは面倒(実際には書いてあった方が、あとでどんなクラスを使っているのかという把握等で便利だったりするので、ない方が良いとは限りません)な場合次のようルールで書いていけば、全く書かなくても大丈夫になります。

アクション名が「some_action_name」だとすると

  • スクリプト名(スクリプトファイル名)

アクション定義省略時にインクルードされるアクションスクリプトは

	    Some/Action/Name.php
	  

となります。つまり、アンスコ「_ 」をディレクトリ区切り「/」にし、さらに先頭1文字を大文字にする。

  • アクションクラス名とフォームクラス名

    {$アプリケーションID}_Action_SomeActionName

    {$アプリケーションID}_Form_SomeActionName

となります(「$アプリケーションID」とは今回の「kaigi」のこと)。つまり、アンスコ「_」を取り、最初を大文字した「SomeActionName」をアクションクラスなら「Kaigi_Action_」に、フォームクラスなら「Kaigi_Form_」の後ろに付ける。

これらのルール自体を変えることも出来るが、それは<URL:http://ethna.jp/ethna-document-dev_guide-action-namingconvention.html>を参照。

スケルトンを作った方がもっと楽?

プロジェクトのルートで(現在僕の環境ではc:/appli/Kaigi)でDOSプロンプトになり、

ethna add-action some_action_name
	  

をやると、前項に書いたルールで、ファイルなどを作ってくれる(2回実行すると、「存在するよ」と言って、途中で終わるので安心!)。

C:\appli\kaigi>ethna add-action some_action_name
file generated [C:\appli\kaigi/skel/skel.action.php -> \
    C:\appli\kaigi/app/action/Some/Action/Name.php]
action script(s) successfully created \
    [C:\appli\kaigi/app/action/Some/Action/Name.php]
	  

スケルトンファイルを変更する

実際にはアプリケーション毎にある程度「スケルトンの元になるファイル」を変更したくなった場合。例えば、継承するクラスを Ethna_ActionFormではなく、(Ethna_ActionFormを継承した)アプリケーション固有のアクションフォームにしたい、といったケース。

この場合は、プロジェクトスケルトン生成後にskelディレクトリに生成されているはずのskel.action.phpを変更することで、生成されるファイルを任意に変更することが出来る(例えば、上記の「C:/appli/kaigi/skel/skel.action.php」)。

アクションクラスの記述

  • Ethna_ActionClassを継承したクラスを定義
  • Ethna_ActionClassのperform()メソッドをオーバーライドして、サーバ側で行いたい処理を記述
  • perform()メソッドの戻り値として遷移先の名前(後述)を返す

となる。これを具体的には「user_login」というアクション名に対応するものを作成するには

  • スケルトンを作る

    ethna add-action user_login

とすると、

C:/appli/kaigi/app/action/User/Login.php
	  

ができ、内容は(コメント行を省略)

<?php
class Kaigi_Form_UserLogin extends Kaigi_ActionForm
{
    /** @var    bool    バリデータにプラグインを使うフラグ */
    var $use_validator_plugin = true;

    /**
     *  @access private
     *  @var    array   フォーム値定義
     */
    var $form = array(
        /*
        'sample' => array(
            // フォームの定義
            'type'          => VAR_TYPE_INT,    // 入力値型
            'form_type'     => FORM_TYPE_TEXT,  // フォーム型
            'name'          => 'サンプル',      // 表示名

            // バリデータ(記述順にバリデータが実行されます)
            'required'      => true,            // 必須オプション(true/false)
            'min'           => null,            // 最小値
            'max'           => null,            // 最大値
            'regexp'        => null,            // 文字種指定(正規表現)

            // フィルタ
            'filter'        => null,            // 入力値変換フィルタオプション
        ),
        */
    );
}

/**
 *  user_loginアクションの実装
 *
 *  @author     {$author}
 *  @access     public
 *  @package    Kaigi
 */
class Kaigi_Action_UserLogin extends Kaigi_ActionClass
{
    /**
     *  user_loginアクションの前処理
     *
     *  @access public
     *  @return string      遷移名(正常終了ならnull, 処理終了ならfalse)
     */
    function prepare()
    {
        return null;
    }

    /**
     *  user_loginアクションの実装
     *
     *  @access public
     *  @return string  遷移名
     */
    function perform()
    {
        return 'user_login';
    }
}
?>
	  

[2007-07-13 16:19]