logo
banner

ErlyWebのテンプレート



目次

ErlyWebのアプリケーション

ErlyWebのディレクトリ構造

以下は、musicアプリケーションの最初のテンプレートのディレクトリ構造です。
(ここまでのことはErlyWebのインストールを参照)

└─music
   ├─src
   │  │  music_app_controller.erl
   │  │
   │  └─components
   │          html_container_view.et
   │          html_container_controller.erl
   │
   ├─www
   │      index.html
   │      style.css
   │
   └─ebin

/musicパス以下へのアクセスは music/src以下のソースファイルによって処理されます。 それ以外へのアクセスは、music/www 以下に対して通常のYawsとして動作します。

コンポーネントについて

ErlyWebにアクセスするときはyaws.confのappmods=<"パス名", erlyweb>で指定したパス名にアクセスすることができます。上記例では、アプリケーション名(AppName)はmusicになりますがパス名とアプリケーション名は関係ありません。
http://サーバ/パス名/コンポーネント名(ComponentName)/関数名/引数1/引数2/... のようなパスにアクセスすると、以下で説明するコンポーネントのコントローラファイル中の関数が指定した引数を使って呼び出されます。コンポーネント名だけ指定すると、コンポーネント中のindex(Arg)関数が呼び出されます。

コンポーネントの作成

コンポーネントはコントローラファイルとビューファイルからなり、/src/componentsフォルダ内に作成します。コントローラファイルにはモデルを使うことがあります。モデルはデータベースを使用するときに使うので、今回のテストでは触れません。また、ビューファイルは使用しないのであれば必要ありません。
コンポーネントのファイルの名前はコンポーネント名を使って次のようにします。コントローラファイルは [ComponentName]_controller.erl でビューファイルは[ComponentName]_view.[Extension]になります。[Extension]はErlangファイルの場合は 'erl'でテンプレートファイルの場合は 'et' です。

テンプレートを使用してみる

コンポーネントを作成する

テンプレートを使用したコンポーネントを作成してみます。名前は forms にしました。コントローラファイル forms_controller.erlとビューファイルforms_view.etをcomponentsフォルダ内に作成します。
(内容は music と関係ないです。^^)

最後の {data, ...}でテンプレートにデータを渡して出力させます。 コンポーネントの各関数の出力については、以下を参考にしてみたください。

forms_controller.erl

-module(forms_controller).

-export([index/1]).

index(A) ->
	case yaws_arg:method(A) of
		'GET' ->
        	Sel = get;
		'POST' ->
            % fruitsの値を取得します。
            case yaws_api:postvar(A,"fruits") of
                {ok,Val} ->
                    Sel = Val;
                Ret ->
               	    % 取得できなかった場合の返り値をSelに代入します。
                    Sel = yaws_api:f("~p",[Ret])
            end
    end,
    % テンプレートにデータを渡して表示します。
   {data, {Sel, "Fruits List",[{"1","Apple"},{"2","Grape"},{"3","Orange"}]}}.

テンプレートを作成します。 テンプレートの書式の詳細はこちら

ちなみに<%! xxxx %>はコメントで<%@ func(xxx) %>は関数を実行します。
<% erlang code %>はerlangのコードを実行します。

forms_view.et

<%! コントローラファイルの index() から渡されたデータを使用して
結果を出力します %>
<%@ index({Method,Title,Fruits}) %>
<html>
<head>
<title>Table List</title>
<link rel="stylesheet" href="/style.css" type="text/css">
</head>
<body>
<div id="content">
<h1><% Title %></h1>
<%! erlnagのコードを実行します。
最初の引数がgetの場合だけformを表示し,その他の場合は、Selの内容を表示します 
%>
<% 
case Method of
	get -> form(Fruits); % formを呼び出します
	Val -> "<div>Your Select:"++Val++"<div>"
end
%>

<%! データからテーブルを表示します %>
<table>
<%! リストから順番に下にある fruits 関数を呼び出します。 %>
<% [fruits(Number, Name) || {Number, Name} <- Fruits] %>
</table>
<br>
</div>
</body>
</html>

<%! ------- 以下関数 ---------- %>
<%! formを出力します。 %>
<%@ form(Fruits) %>
<form method="POST">
Fruits:
<select name="fruits">
<% [fruitsOption(Name) || {_Number, Name} <- Fruits] %>
</select>
<input type="submit"/>
</form>

<%@ fruitsOption( Name) %>
  <option value="<% Name %>"><% Name %></option>

<%! テーブルのレコードを出力します。 %>
<%@ fruits(Number, Name) %>
<tr>
  <td><% Number %></td>
  <td><% Name %></td>
</tr>

コンパイルします。

(win@PC-114)2> erlyweb:compile("/work/apps/music",[]).
debug:erlyweb_compile:382: Compiling Erlang file "music_app_controller"
debug:erlyweb_compile:382: Compiling Erlang file "forms_controller"
debug:erlyweb_compile:377: Compiling ErlTL file "forms_view"
debug:erlyweb_compile:382: Compiling Erlang file "html_container_controller"
debug:erlyweb_compile:377: Compiling ErlTL file "html_container_view"
{ok,{{2008,2,22},{10,27,53}}}

実行結果

実行すると選択した結果が表示されます。

画像:Erlyweb-forms-POST.gif

Copyright (C) 2007 KLab Inc. All Rights Reserved.