出典 : UNICORN FlowXMLについて - デジタルクエスト 開発ブログ様 (執筆:atarun様)

※記事の掲載及び提供に深く感謝します。

‘FlowXML’とは?

Webアプリケーション開発に特化したUNICORNの機能の一つです。
xmlに処理(Flow)を記述していく事により、一連の処理の流れ(フロー)を1つのxmlファイルに定義する事が出来き 面倒なformの復帰や確認画面でのhiddenタグの挿入といった、Webアプリケーションに欠かせない機能の多くをフレームワークが自動的に処理してくれるようになります。 また定義したフローをUNICORNPHPに変換したものを自動的に作成(autogenerate)してくれます。

xmlで記述していく事に少なからず抵抗がある方もいるかも知れませんが、必要最低限の処理をFlowXMLで記述する事によりUNICORN側で自動的にその他の処理も追加した状態でPHP化してくれるので、慣れれば素早く開発する事が可能になるでしょう。 もちろんPHPFrameworkなので、直接PHPファイルを作成して処理を記述する事も出来ます。

FlowXMLで使用出来るタグ

FlowXMLで使用出来るタグは実に様々です。 下記のタグを理解する事で、より素早く処理を記述する事が出来ます。

section

  • id sectionを一意に識別するための値です。 autogenerateされたPHPのクラス名に該当します。

例)Helloというsectionを宣言します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
    </section>
</xml>

prepend

executeが実行される前に実行したい処理はprepend内に記述します。

例)prependの処理が終了した後にexecuteの処理を実行します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <prepend>
            <!-- 処理を記述 -->
        </prepend>
        <execute>
            <!-- 処理を記述 -->
        </execute>
    </section>
</xml>

execute

処理を実行します。主な処理はsection配下に記述したexecute内に実装します。 特定のクラスやメソッドの実行にも使用可能です。

  • val 実行する処理を宣言します。
  • class 実行するクラス名を宣言します。
  • method 実行するメソッド名を宣言します。

例)文字列"hoge"をechoする

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <execute val="echo &quot;hoge&quot;"/>
        </execute>
    </section>
</xml>

append

executeが実行された後に実行したい処理はappend内に記述する

例)

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <!-- 処理を記述 -->
        </execute>
        <append>
            <!-- 処理を記述 -->
        </append>
    </section>
</xml>

flow

“次の処理”“を明示します。

  • section sectionid、又はbackflow1指定します。
  • redirect 指定されたsectionへリダイレクトさせるかを宣言します。 true又はfalseを指定します。
  • flowpostformsection HTMLformタグに指定したsectionを遷移先として指定し、formの入力値を引き渡す場合に宣言します。

例)

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <flow section="Hello-world" redirect="true"/>
        </execute>
    </section>
    <section id="Hello-world">
        <execute>
        </execute>
    </section>
</xml>

assign

  • var 値を代入する変数名を宣言します。
  • val varで宣言された変数に代入する値を指定します。
  • class 実行するクラス名を宣言します。
  • method 実行するメソッド名を宣言します。
  • arg+(number) メソッドの引数を指定します。arg1arg2の様に複数指定する事が出来ます。

例)Hogeクラスのtestメソッドに文字列"foo"を引数として渡し、結果を変数$barに格納します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <assign var="bar" class="Hoge" method="test" arg1="'foo'"/>
        </execute>
    </section>
</xml>

rest

UNICORNの機能であるautorestを利用してDBSQLを発行します。

  • assign 実行結果を代入する変数名を宣言します。
  • execute authAndExecute又はexecuteを指定します。
  • resource DBのテーブルを指定します。
  • method GET・POST・PUT・DELETEの何れかを指定します。 それぞれSELECT・INSERT・UPDATE・DELETEに該当します。
  • params その他の条件やSQLを指定します。 JOIN ORDER OFFSET LIMIT GROUP BY句もここで指定します。 json形式で指定します。

例)fooテーブルの一覧をidの降順で20件取得し、結果をbarという変数に代入します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <rest assign var="bar" execute="authAndExecute" resource="foo" method="GET" params="{&quot;ORDER&quot;:&quot;id DESC&quot;, &quot;LIMIT&quot;:&quot;20&quot;}"/>
        </execute>
    </section>
</xml>

if, elseif, else

PHPif文と同様に条件分岐を行います。

  • var 比較結果を宣言します。
  • val 比較内容を宣言します。

例)条件分岐により変数$hogeに数値を代入し、結果をechoします。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <if var="true" val="$hoge === 'foo'">
                <execute var="hoge" val="1"/>
            </if>
            <elseif var="true" val="$hoge === 'bar'">
                <execute var="hoge" val="2"/>
            </elseif>
            <else>
                <execute var="hoge" val="3"/>
            </else>
            <execute val="echo $hoge"/>
        </execute>
    </section>
</xml>

foreach

  • eachas ループさせる変数名を指定します。 キーは「変数名+key」、値は「変数名+val」で表します。

例)配列$hogeをループさせ、そのキーと値をechoします。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <foreach eachas="$hoge">
                <execute val="echo $hogekey . ':' . $hogeval"/>
            </foreach>
        </execute>
    </section>
</xml>

view

※省略可 現在のsection上で表示するhtmlファイルの指定やhtmlformの値の受け渡しについて指定する事が出来ます。 省略した場合、現在のsectionidと同名のhtmlファイルがデフォルト値となります。

  • section sectionidを指定します。

  • flowpostformsection htmlformに入力された値の引き渡し先となるsectionidを指定します。
  • confirmflowpostformsection flowpostformsectionにより渡された値の更に引き渡し先となるsectionidを指定します。
  • backflowpostformsection htmlformに入力された値の復帰先となるsectionidを指定します。
  • sslrequired HTTPSプロトコルを適用するかを明示的に指定します。 true又はfalseを指定します。

例) Hello-onesectionHello-twoを、formのリクエスト先としてHTMLを描画します。 Hello-twoHello-oneからリクエストされた値を受取り、確認用のHTMLを描画します。戻り先をsectionHello-oneとしています。渡し先をsectionHello-threeとしています。 Hello-threesectionHelloで使用しているHTMLファイルを描画します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello-one">
        <execute>
            <view flowpostformsection="Hello-two"/>
        </execute>
    </section>
    <section id="Hello-two">
        <execute>
            <view confirmflowpostformsection="Hello-three" backflowpostformsection="Hello-one"/>
        </execute>
    </section>
    <section id="Hello-three">
        <execute>
            <view section="Hello"/>
        </execute>
    </section>
</xml>

flowviewparam

viewで描画されるHTMLに値を渡す事が出来ます。

  • selector HTMLid, class属性の値を指定します。指定方法はCSSと同じです。
  • val selectorに代入する値を指定します。

例)hello.htmlの<div id="#foo></div>"というタグに"bar"という文字列を埋め込みます。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <flowviewparam selector="#foo" val="`bar`"/>
            <view/>
        </execute>
    </section>
</xml>

cancelthisbackflow

backflow処理をキャンセルします。

clearbackflow

backflowに設定されている値をクリアします。

flowpostformsectionerror

htmlflowpostformsectionerrorという属性を宣言した箇所に文字列を埋め込みます。

例)html"Error"という文字列をエラーメッセージとして渡します。

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <flowpostformsectionerror>Error</flowpostformsectionerror>
        </execute>
    </section>
</xml>

exception

Exceptionを宣言し、処理を終了します。

例)

<?xml version="1.0" ?>
<xml>
    <section id="Hello">
        <execute>
            <exception/>
        </execute>
    </section>
</xml>

以上がUNICORNFlowXMLで使える主なxmlタグの一覧になります。 これらのタグとHTMLJavaScriptを用いて非常にスピーディーにUNICORNによる開発を行う事が可能です。

例えばflowsectionbackflowを指定する事で、前回の処理を手軽に復帰させる事が出来ます。

  1. backflowとは、現在のsectionの一つ前のsectionに関する処理を表します。