<commit_before># アプリケーションの構築

http://ethna.jp/old/ethna-document-tutorial-practice2.html

実際のアプリケーション構築は、「アクション、(ビュー、)  テンプレート」を追加していく作業の繰り返しとなります。

##「アクション」とは何か？

* クライアントから何らかのリクエスト(例えばURLへのアクセスや、submitボタンのクリック)を受け取って
* サーバ側で何らかの処理をして
* 結果をクライアントにに出力する

という一連の処理単位がアクションです。

ここでは単純な例として、まず「ログイン画面の表示」というアクションを追加してみます。
このとき必要となる作業は、以下の図のようになります(半透明なブロックは、省略可能な作業であることを示しています)。

ethna-fig4.png

(4) アクション定義の追加(省略可)
Controllerにアクション定義を追加します。具体的には、app/Sample_Controller.phpを以下のように編集します。

var $action = array(
/*
*  TODO: ここにaction定義を記述してください
*
*  記述例：
*
*  'index'     => array(),
*/
+      'login'             => array(
+          'class_name' => 'Sample_Action_Login'
),
);
これは「login」というアクションに、'Sample_Action_Login'というクラス名を関連付けることを意味します。

なお、慣れてくると毎回'class_name'属性等を記述するのは面倒になってくるので、実際にはこれを省略することも可能です(コメント部分に記述されている'index'アクションは省略された形です)。さらには、アクション定義自体(このステップ)を省略することも可能です。

アクション定義と、インクルードされるスクリプトファイル名やアクションクラス名の関係、省略方法については、下記をご覧下さい。

see also: アクション定義を省略する

(5) アクションクラスの記述
(4)で定義したアクションに対応するクラスを作成します(このクラスを「アクションクラス」と呼んでいます)。アクションに対応するクラスは以下のように記述します。

Ethna_ActionClassを継承したクラスを定義します
Ethna_ActionClassのperform()メソッドをオーバーライドして、サーバ側で行いたい処理を記述します
perform()メソッドの戻り値として遷移先の名前(後述)を返します
さて、ここでは上記のとおり「Sample_Action_Login」を作成してみます。アクションクラスを定義したファイル(アクションスクリプトと呼んでいます*1)は、app/actionに以下のような命名規則で作成します('_'をディレクトリで区切り、ファイル名は大文字で開始します)。

アクション名の先頭を大文字にします
'_'を'/'に置き換え(= ディレクトリで区切り)続く文字を大文字にします
ですので以下のようになります。

スクリプトファイル
app/action/Login.php
app/action/User/List/Add.php
ですので、ここでは'login'というアクションに対応するファイルを作成するので、app/action/Login.phpというファイルを以下のように作成すればよいことになります。

<?php
class Sample_Action_Login extends Ethna_ActionClass
{
function perform()
{
return 'login';
}
}
?>
このクラスでは、サーバ側では何も処理を行わずに'login'という遷移先を返しています。つまり

なにもしないで'login'というビューを表示する

という処理になります。

実際には、毎回アクションスクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-actionオプションを利用して、スケルトンファイルを生成することも出来ます。

例:

$ ethna add-action login
see also: アクションスクリプトのスケルトンを生成する

なお、アクションスクリプトを配置するディレクトリは適宜変更することが可能です。

see also: アクションスクリプトの配置ディレクトリを変更する

また、前述したアクションクラスやアクションスクリプトのファイル命名規則等も変更することが可能です。

see also: アクション定義省略時の命名規則を変更する

(6) ビュー定義の追加(省略可)
次に、アクションクラスが返す遷移先(この場合'login'という遷移先)を定義します。

具体的には、Controllerに遷移先定義を追加します。app/Sample_Controller.phpを以下のように編集してください。

/**
*  @var    array   forward定義
*/
var $forward = array(
/*
*  TODO: ここにforward先を記述してください
*
*  記述例：
*
*  'index'         => array(
*      'view_name' => 'Sample_View_Index',
*  ),
*/
+    'login' => array(
+        'view_name' => 'Sample_View_Login',
+        'forward_path' => 'login.tpl'
),
);
これで、'login'という遷移先にSample_View_Loginというビュークラスと、login.tplというテンプレートファイルが関連付けられます。

なお、Ethnaのビューは、以下のように構成されています。

ethna-fig5.png
Action Classは、実行中に取得したダイナミックな表示データをAction Formオブジェクトに格納します(Action Formオブジェクトはコンテナとして振舞います)
アクションクラスは、コントローラに遷移先を返します
コントローラは、アクションクラスから返された遷移先に基づいて、ビューオブジェクトを生成します
ビューオブジェクトは、ダイナミックな表示データをアクションフォームから取得します
ビューオブジェクトはSmartyオブジェクトを生成し、必要な変数をSmartyオブジェクトに設定します
テンプレートを出力します
なお、実際にビュー1つ作るたびにこのような定義を記述するのは煩雑なので、アクション定義と同様にビュー定義も省略することが可能です。

see also: 遷移先定義を省略する

さらに、アクションクラス等と同様に、省略時のビュークラスやテンプレートファイル名の命名規則を変更することも可能です。

see also: ビューの命名規則を変更する

see also: テンプレートの命名規則を変更する

(7) ビュークラスの記述
ここでは、(6)で定義したビュークラスSample_View_Loginを作成します。ビュークラスを定義したファイル(ビュースクリプト、とでも呼んでおきます)は、アクションクラスと同様にapp/viewに以下のような命名規則で作成します('_'をディレクトリで区切り、ファイル名は大文字で開始します)。

スクリプトファイル
app/view/Login.php
app/view/User/List/Add.php
ですので、ここでは'login'という遷移名に対応するファイルを作成するのuser_list_addlogin遷移名user_list_addloginアクション名

ですので、ここでは'login'という遷移名に対応するファイルを作成するので、app/view/Login.phpというファイルを以下のように作成します。

<?php
class Sample_View_Login extends Ethna_ViewClass
{
function preforward()
{
$this->af->setApp('now', strftime('%Y/%m/%d'));
}
}
?>
preforward()メソッドはテンプレート表示前に呼び出され、テンプレートに関連した各種データ(セレクトボックスの表示項目等)を設定することが可能です。ここでは、コンテナに'now'という名前で現在時刻を格納しています。

実際には、毎回ビュースクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-viewオプションを利用して、スケルトンファイルを生成することも出来ます。

例:

$ ethna add-view login
この時に-tオプションをつける事によって、同時にテンプレートのスケルトンファイルが生成されます。

例:

$ ethna add-view -t login
また、ビュークラスが不要な場合(単純にテンプレートを表示したい場合等)は、ビュークラスの記述を省略することも可能です。

(8) テンプレートの記述
次に、テンプレートファイルを作成します。テンプレートディレクトリはtemplate/jaディレクトリで、(6)で'login.tpl'をテンプレートファイルに指定しているので、template/ja/login.tplを作成します。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body>
Login View<br />
current time: {$app.now}
</body>
</html>
実際には、毎回アクションスクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-template オプションを利用して、スケルトンファイルを生成することも出来ます。

$ ethna add-template login
上記のとおり、テンプレートに{$app.foo}と記述すると、アクションクラス、あるいはビュークラスで

$this->af->setApp('foo', 'bar');
として設定した値にアクセスすることが出来ます。

なお、テンプレートディレクトリを変更することも可能です。

see also: テンプレートディレクトリを変更する

(9) 確認
以上でアクションの追加は完了ですので、実際にアクセスして動作を確認します。

http://some.host/~foo/?action_login=true
(4)〜(8)で定義した通りに、以下のような画面が表示されれば成功です。

ethna-fig6.jpg
もう少し複雑なアクションについては、次節アプリケーション構築手順(3)をご覧下さい。

<commit_msg>ツイッターで例えるとわかりやすい。<commit_after># アプリケーションの構築

http://ethna.jp/old/ethna-document-tutorial-practice2.html

実際のアプリケーション構築は、「アクション、(ビュー、)  テンプレート」を追加していく作業の繰り返しとなります。

##「アクション」とは何か？

* クライアントから何らかのリクエスト(例えばURLへのアクセスや、submitボタンのクリック)を受け取って
* サーバ側で何らかの処理をして
* 結果をクライアントにに出力する

という一連の処理単位がアクションです。

ツイッターで例えると、「ツイートをする」「ツイートを削除する」「タイムラインを表示する」などがそれぞれ１アクションです。

ここでは単純な例として、まず「ログイン画面の表示」というアクションを追加してみます。
このとき必要となる作業は、以下の図のようになります(半透明なブロックは、省略可能な作業であることを示しています)。

ethna-fig4.png

(4) アクション定義の追加(省略可)
Controllerにアクション定義を追加します。具体的には、app/Sample_Controller.phpを以下のように編集します。

var $action = array(
/*
*  TODO: ここにaction定義を記述してください
*
*  記述例：
*
*  'index'     => array(),
*/
+      'login'             => array(
+          'class_name' => 'Sample_Action_Login'
),
);
これは「login」というアクションに、'Sample_Action_Login'というクラス名を関連付けることを意味します。

なお、慣れてくると毎回'class_name'属性等を記述するのは面倒になってくるので、実際にはこれを省略することも可能です(コメント部分に記述されている'index'アクションは省略された形です)。さらには、アクション定義自体(このステップ)を省略することも可能です。

アクション定義と、インクルードされるスクリプトファイル名やアクションクラス名の関係、省略方法については、下記をご覧下さい。

see also: アクション定義を省略する

(5) アクションクラスの記述
(4)で定義したアクションに対応するクラスを作成します(このクラスを「アクションクラス」と呼んでいます)。アクションに対応するクラスは以下のように記述します。

Ethna_ActionClassを継承したクラスを定義します
Ethna_ActionClassのperform()メソッドをオーバーライドして、サーバ側で行いたい処理を記述します
perform()メソッドの戻り値として遷移先の名前(後述)を返します
さて、ここでは上記のとおり「Sample_Action_Login」を作成してみます。アクションクラスを定義したファイル(アクションスクリプトと呼んでいます*1)は、app/actionに以下のような命名規則で作成します('_'をディレクトリで区切り、ファイル名は大文字で開始します)。

アクション名の先頭を大文字にします
'_'を'/'に置き換え(= ディレクトリで区切り)続く文字を大文字にします
ですので以下のようになります。

スクリプトファイル
app/action/Login.php
app/action/User/List/Add.php
ですので、ここでは'login'というアクションに対応するファイルを作成するので、app/action/Login.phpというファイルを以下のように作成すればよいことになります。

<?php
class Sample_Action_Login extends Ethna_ActionClass
{
function perform()
{
return 'login';
}
}
?>
このクラスでは、サーバ側では何も処理を行わずに'login'という遷移先を返しています。つまり

なにもしないで'login'というビューを表示する

という処理になります。

実際には、毎回アクションスクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-actionオプションを利用して、スケルトンファイルを生成することも出来ます。

例:

$ ethna add-action login
see also: アクションスクリプトのスケルトンを生成する

なお、アクションスクリプトを配置するディレクトリは適宜変更することが可能です。

see also: アクションスクリプトの配置ディレクトリを変更する

また、前述したアクションクラスやアクションスクリプトのファイル命名規則等も変更することが可能です。

see also: アクション定義省略時の命名規則を変更する

(6) ビュー定義の追加(省略可)
次に、アクションクラスが返す遷移先(この場合'login'という遷移先)を定義します。

具体的には、Controllerに遷移先定義を追加します。app/Sample_Controller.phpを以下のように編集してください。

/**
*  @var    array   forward定義
*/
var $forward = array(
/*
*  TODO: ここにforward先を記述してください
*
*  記述例：
*
*  'index'         => array(
*      'view_name' => 'Sample_View_Index',
*  ),
*/
+    'login' => array(
+        'view_name' => 'Sample_View_Login',
+        'forward_path' => 'login.tpl'
),
);
これで、'login'という遷移先にSample_View_Loginというビュークラスと、login.tplというテンプレートファイルが関連付けられます。

なお、Ethnaのビューは、以下のように構成されています。

ethna-fig5.png
Action Classは、実行中に取得したダイナミックな表示データをAction Formオブジェクトに格納します(Action Formオブジェクトはコンテナとして振舞います)
アクションクラスは、コントローラに遷移先を返します
コントローラは、アクションクラスから返された遷移先に基づいて、ビューオブジェクトを生成します
ビューオブジェクトは、ダイナミックな表示データをアクションフォームから取得します
ビューオブジェクトはSmartyオブジェクトを生成し、必要な変数をSmartyオブジェクトに設定します
テンプレートを出力します
なお、実際にビュー1つ作るたびにこのような定義を記述するのは煩雑なので、アクション定義と同様にビュー定義も省略することが可能です。

see also: 遷移先定義を省略する

さらに、アクションクラス等と同様に、省略時のビュークラスやテンプレートファイル名の命名規則を変更することも可能です。

see also: ビューの命名規則を変更する

see also: テンプレートの命名規則を変更する

(7) ビュークラスの記述
ここでは、(6)で定義したビュークラスSample_View_Loginを作成します。ビュークラスを定義したファイル(ビュースクリプト、とでも呼んでおきます)は、アクションクラスと同様にapp/viewに以下のような命名規則で作成します('_'をディレクトリで区切り、ファイル名は大文字で開始します)。

スクリプトファイル
app/view/Login.php
app/view/User/List/Add.php
ですので、ここでは'login'という遷移名に対応するファイルを作成するのuser_list_addlogin遷移名user_list_addloginアクション名

ですので、ここでは'login'という遷移名に対応するファイルを作成するので、app/view/Login.phpというファイルを以下のように作成します。

<?php
class Sample_View_Login extends Ethna_ViewClass
{
function preforward()
{
$this->af->setApp('now', strftime('%Y/%m/%d'));
}
}
?>
preforward()メソッドはテンプレート表示前に呼び出され、テンプレートに関連した各種データ(セレクトボックスの表示項目等)を設定することが可能です。ここでは、コンテナに'now'という名前で現在時刻を格納しています。

実際には、毎回ビュースクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-viewオプションを利用して、スケルトンファイルを生成することも出来ます。

例:

$ ethna add-view login
この時に-tオプションをつける事によって、同時にテンプレートのスケルトンファイルが生成されます。

例:

$ ethna add-view -t login
また、ビュークラスが不要な場合(単純にテンプレートを表示したい場合等)は、ビュークラスの記述を省略することも可能です。

(8) テンプレートの記述
次に、テンプレートファイルを作成します。テンプレートディレクトリはtemplate/jaディレクトリで、(6)で'login.tpl'をテンプレートファイルに指定しているので、template/ja/login.tplを作成します。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body>
Login View<br />
current time: {$app.now}
</body>
</html>
実際には、毎回アクションスクリプトを1から記述するのは煩雑なので、ethnaコマンドのadd-template オプションを利用して、スケルトンファイルを生成することも出来ます。

$ ethna add-template login
上記のとおり、テンプレートに{$app.foo}と記述すると、アクションクラス、あるいはビュークラスで

$this->af->setApp('foo', 'bar');
として設定した値にアクセスすることが出来ます。

なお、テンプレートディレクトリを変更することも可能です。

see also: テンプレートディレクトリを変更する

(9) 確認
以上でアクションの追加は完了ですので、実際にアクセスして動作を確認します。

http://some.host/~foo/?action_login=true
(4)〜(8)で定義した通りに、以下のような画面が表示されれば成功です。

ethna-fig6.jpg
もう少し複雑なアクションについては、次節アプリケーション構築手順(3)をご覧下さい。


{'fraction_non_alphanumeric': 0.10954174513496548, 'fraction_numerical': 0.0053358443188951665, 'mean_word_length': 9.158342189160468, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '953623', 'n_tokens_mistral': 7415, 'n_tokens_neox': 6984, 'n_words': 387}