2023年7月31日月曜日

Cozy Web/エンティティ更新のカスタム画面

Cozy Web上でエンティティのモデル定義をすることで、Web上でのリソースアクセスをノンプログラミングで行う方法についてみています。

前回はエンティティ更新の方法について説明しました。

モデルを定義するだけで、エンティティの更新画面が自動的に提供されることを確認しました。エンティティ更新を入力、確認、表示の3画面を使って行うことができました。

前回は、画面そのものはCozyが作成したデフォルト画面です。今回はエンティティ更新のカスタム画面を設定する方法について説明します。

HelloResource

ここまで作成したHelloResourceは、モデルの定義が行われており、エンティティの作成と更新を行うことができます。エンティティの作成では、アプリケーションが定義したビューを使用するようになっています。

今回は更新処理のアプリケーション定義ビューを追加します。

準備

cozyを起動するディレクトリのwebappsディレクトリに、アプリケーションのホームディレクトリとなるHelloResourceが作成されています。これをベースに開発を進めます。

モデル

WEB-INF/models/model.orgにアプリケーションで使用するモデルが定義されています。

* entity  
** product
*** features  
table=product
*** attributes  
| Name  | Type   | Multiplicity |
|-------+--------+--------------|
| id    | token  |            1 |
| name  | string |            1 |
| price | int    |            1 |

エンティティproductを定義しています。

これがWebのリソースproductとなります。

トップページ

トップページとしてホームディレクトリに以下のindex.htmlを配備しています。

<html>
    <head>
	<title>HelloResource</title>
    </head>
    <body>
	<ul>
	    <li><a href="product">List</a></li>
	    <li><a href="product/_create_">Create</a></li>
	    <li><a href="product/_update_">Update</a></li>
	</ul>
    </body>
</html>

エンティティ操作シナリオ

エンティティのモデル定義を行うとエンティティ作成シナリオが自動的に作成されます。

エンティティの更新には以下の2種類があります。

  • 更新するエンティティのIDを更新画面から入力
  • 更新するエンティティのIDを更新開始時に指定

アプリケーション定義ビュー

エンティティの更新シナリオの3つの処理、入力処理、確認処理、表示処理それぞれのアプリケーションのカスタム画面をみていきます。

入力画面

カスタムの入力画面として以下のupdate__input.htmlをproduct.entityディレクトリに配備します。

<html>
    <head>
	<title>Update Product/Input</title>
    </head>
    <body>
	<h1>Update Product/Input</h1>
	<c:detail />
    </body>
</html>

タグ c:detail の場所に入力処理用の入力フォームが出力されます。

デフォルト画面との変更点はヘッダと画面のタイトル部を追加している点です。ここではシンプルな追加のみにしていますが、必要に応じて画面のデザインを追加していく形になります。

確認画面

カスタムの入力画面として以下のupdate__confirm.htmlをproduct.entityディレクトリに配備します。

<html>
    <head>
	<title>Update Product/Confirm</title>
    </head>
    <body>
	<h1>Update Product/Confirm</h1>
	<c:detail />
    </body>
</html>

タグ c:detail の場所に確認処理用のフォームが出力されます。

入力画面と同様に、変更点はヘッダと画面のタイトル部を追加している点です。

表示画面

カスタムの入力画面として以下のupdate__show.htmlをproduct.entityディレクトリに配備します。

<html>
    <head>
	<title>Update Product/Show</title>
    </head>
    <body>
	<h1>Update Product/Show</h1>
	<c:detail />
    </body>
</html>

タグ c:detail の場所に結果確認処理用のフォームが出力されます。

入力画面や確認画面と同様に、変更点はヘッダと画面のタイトル部を追加している点です。

実行

それではIDを指定したエンティティの更新を実行してみましょう。

エンティティ更新ページ

IDを指定してリエンティティの更新を行ってみます。IDが1の場合は以下になります。

$ curl http://localhost:8080/web/HelloResource/product/1/_update_

次のようにエンティティ作成に必要なデータを登録するためのFORMの画面が表示されました。

update__input.htmlとして登録した入力ページが表示されました。

画面のタイトルとして、カスタム画面の定義が使用されていることが分かります。

<!DOCTYPE html>
<html><head>
	<title>Update Product/Input</title>
    </head><body>
	<h1>Update Product/Input</h1>
	<form action="" method="POST">
      <table class="">
      <tbody><tr class=""><th scope="row" class="">Id</th><td class=""><input type="text" name="id" value="1" /></td></tr><tr class=""><th scope="row" class="">Name</th><td class=""><input type="text" name="name" value="Apple" /></td></tr><tr class=""><th scope="row" class="">Price</th><td class=""><input type="text" name="price" value="300" /></td></tr></tbody>
      </table>
      <table>
        <tr><td><input type="submit" name="$submit" value="Input" /></td><td><input type="submit" name="$submit" value="Cancel" /></td></tr>
      </table>
      <input type="hidden" name="$scenario" value="{&quot;name&quot;:&quot;update-entity&quot;,&quot;state&quot;:&quot;input&quot;,&quot;entity&quot;:&quot;product&quot;,&quot;schema&quot;:{&quot;columns&quot;:[{&quot;name&quot;:&quot;id&quot;,&quot;datatype&quot;:&quot;token&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;name&quot;,&quot;datatype&quot;:&quot;string&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;price&quot;,&quot;datatype&quot;:&quot;int&quot;,&quot;multiplicity&quot;:&quot;1&quot;}]},&quot;data&quot;:{},&quot;id&quot;:&quot;1&quot;}" />
    </form>
    
</body></html>

作成の場合と違って、FORMの中にID「1」の情報が動的的に設定されています。

このページでは以下のボタンが表示されています。

Input
データ登録
Cancel
キャンセル

ID 1のデータはAppleですが、値段を100円から150円に変更しましょう。

Inputボタンを押下するとエンティティ更新のための次の画面に遷移します。

Cancelボタンを押下するとトップページに戻ります。

登録データ確認ページ

データ登録画面でInputボタンを押すと、登録データ確認画面が表示されます。

update__confirm.htmlとして登録した入力ページが表示されました。

画面のタイトルとして、カスタム画面の定義が使用されていることが分かります。

<!DOCTYPE html>
<html><head>
	<title>Update Product/Confirm</title>
    </head><body>
	<h1>Update Product/Confirm</h1>
	<form action="" method="POST">
      <table class="">
      <tbody><tr class=""><th scope="row" class="">Id</th><td class="">1</td></tr><tr class=""><th scope="row" class="">Name</th><td class="">Apple</td></tr><tr class=""><th scope="row" class="">Price</th><td class="">150</td></tr></tbody>
      </table>
      <input type="hidden" name="id" value="1" /><input type="hidden" name="name" value="Apple" /><input type="hidden" name="price" value="150" />
      <table>
        <tr><td><input type="submit" name="$submit" value="Ok" /></td><td><input type="submit" name="$submit" value="Ok_show" /></td><td><input type="submit" name="$submit" value="Back" /></td><td><input type="submit" name="$submit" value="Cancel" /></td></tr>
      </table>
      <input type="hidden" name="$scenario" value="{&quot;name&quot;:&quot;update-entity&quot;,&quot;state&quot;:&quot;confirm&quot;,&quot;entity&quot;:&quot;product&quot;,&quot;schema&quot;:{&quot;columns&quot;:[{&quot;name&quot;:&quot;id&quot;,&quot;datatype&quot;:&quot;token&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;name&quot;,&quot;datatype&quot;:&quot;string&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;price&quot;,&quot;datatype&quot;:&quot;int&quot;,&quot;multiplicity&quot;:&quot;1&quot;}]},&quot;data&quot;:{&quot;name&quot;:&quot;Apple&quot;,&quot;$scenario&quot;:&quot;{\&quot;name\&quot;:\&quot;update-entity\&quot;,\&quot;state\&quot;:\&quot;input\&quot;,\&quot;entity\&quot;:\&quot;product\&quot;,\&quot;schema\&quot;:{\&quot;columns\&quot;:[{\&quot;name\&quot;:\&quot;id\&quot;,\&quot;datatype\&quot;:\&quot;token\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}, {\&quot;name\&quot;:\&quot;name\&quot;,\&quot;datatype\&quot;:\&quot;string\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}, {\&quot;name\&quot;:\&quot;price\&quot;,\&quot;datatype\&quot;:\&quot;int\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}]},\&quot;data\&quot;:{},\&quot;id\&quot;:\&quot;1\&quot;}&quot;,&quot;price&quot;:&quot;150&quot;,&quot;id&quot;:&quot;1&quot;,&quot;$submit&quot;:&quot;Input&quot;},&quot;id&quot;:&quot;1&quot;}" />
    </form>
    
</body></html>

画面に入力したデータが表示されます。この結果を確認した上で、以下のいずれかのボタンを押下します。

Ok
確認OK
Ok_show
確認OKで結果を表示
Back
入力画面にモデル
Cancel
キャンセル

Ok_showボタンを押下するとエンティティ更新が行われ、更新した情報の表示画面に遷移します。

Okの場合は、エンティティ更新後トップページに遷移します。

結果ページ

更新確認画面でOK_showボタンを押すと、エンティティの更新が行われ、作成されたエンティティの情報表示ページに移ります。

update__show.htmlとして登録した入力ページが表示されました。

画面のタイトルとして、カスタム画面の定義が使用されていることが分かります。

<!DOCTYPE html>
<html><head>
	<title>Update Product/Show</title>
    </head><body>
	<h1>Update Product/Show</h1>
	<form action="" method="POST">
      <table class="">
      <tbody><tr class=""><th scope="row" class="">Id</th><td class="">1</td></tr><tr class=""><th scope="row" class="">Name</th><td class="">Apple</td></tr><tr class=""><th scope="row" class="">Price</th><td class="">150</td></tr></tbody>
      </table>
      <input type="hidden" name="id" value="1" /><input type="hidden" name="name" value="Apple" /><input type="hidden" name="price" value="150" />
      <table>
        <tr><td><input type="submit" name="$submit" value="Ok" /></td></tr>
      </table>
      <input type="hidden" name="$scenario" value="{&quot;name&quot;:&quot;update-entity&quot;,&quot;state&quot;:&quot;show&quot;,&quot;entity&quot;:&quot;product&quot;,&quot;schema&quot;:{&quot;columns&quot;:[{&quot;name&quot;:&quot;id&quot;,&quot;datatype&quot;:&quot;token&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;name&quot;,&quot;datatype&quot;:&quot;string&quot;,&quot;multiplicity&quot;:&quot;1&quot;}, {&quot;name&quot;:&quot;price&quot;,&quot;datatype&quot;:&quot;int&quot;,&quot;multiplicity&quot;:&quot;1&quot;}]},&quot;data&quot;:{&quot;name&quot;:&quot;Apple&quot;,&quot;$scenario&quot;:&quot;{\&quot;name\&quot;:\&quot;update-entity\&quot;,\&quot;state\&quot;:\&quot;confirm\&quot;,\&quot;entity\&quot;:\&quot;product\&quot;,\&quot;schema\&quot;:{\&quot;columns\&quot;:[{\&quot;name\&quot;:\&quot;id\&quot;,\&quot;datatype\&quot;:\&quot;token\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}, {\&quot;name\&quot;:\&quot;name\&quot;,\&quot;datatype\&quot;:\&quot;string\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}, {\&quot;name\&quot;:\&quot;price\&quot;,\&quot;datatype\&quot;:\&quot;int\&quot;,\&quot;multiplicity\&quot;:\&quot;1\&quot;}]},\&quot;data\&quot;:{\&quot;name\&quot;:\&quot;Apple\&quot;,\&quot;$scenario\&quot;:\&quot;{\\\&quot;name\\\&quot;:\\\&quot;update-entity\\\&quot;,\\\&quot;state\\\&quot;:\\\&quot;input\\\&quot;,\\\&quot;entity\\\&quot;:\\\&quot;product\\\&quot;,\\\&quot;schema\\\&quot;:{\\\&quot;columns\\\&quot;:[{\\\&quot;name\\\&quot;:\\\&quot;id\\\&quot;,\\\&quot;datatype\\\&quot;:\\\&quot;token\\\&quot;,\\\&quot;multiplicity\\\&quot;:\\\&quot;1\\\&quot;}, {\\\&quot;name\\\&quot;:\\\&quot;name\\\&quot;,\\\&quot;datatype\\\&quot;:\\\&quot;string\\\&quot;,\\\&quot;multiplicity\\\&quot;:\\\&quot;1\\\&quot;}, {\\\&quot;name\\\&quot;:\\\&quot;price\\\&quot;,\\\&quot;datatype\\\&quot;:\\\&quot;int\\\&quot;,\\\&quot;multiplicity\\\&quot;:\\\&quot;1\\\&quot;}]},\\\&quot;data\\\&quot;:{},\\\&quot;id\\\&quot;:\\\&quot;1\\\&quot;}\&quot;,\&quot;price\&quot;:\&quot;150\&quot;,\&quot;id\&quot;:\&quot;1\&quot;,\&quot;$submit\&quot;:\&quot;Input\&quot;},\&quot;id\&quot;:\&quot;1\&quot;}&quot;,&quot;price&quot;:&quot;150&quot;,&quot;id&quot;:&quot;1&quot;,&quot;$submit&quot;:&quot;Ok_show&quot;},&quot;id&quot;:&quot;1&quot;}" />
    </form>
    
</body></html>

作成したエンティティのデータが表示されます。この結果を確認した後に、OKボタンを押下するとトップページに戻ります。

確認

確認のためにリソースproductの一覧を表示してみましょう。

$ curl http://localhost:8080/web/HelloResource/product

以下のようにオブジェクトID 1のAppleの値段が150に変更されました。

<?xml version="1.0"?>
<!DOCTYPE html>
<html>
  <head>
    <title>Product List</title>
  </head>
  <body>
    <table class="">
      <caption class="">product</caption>
      <thead class="">
        <tr class="">
          <th scope="col" class="">Id</th>
          <th scope="col" class="">Name</th>
          <th scope="col" class="">Price</th>
        </tr>
      </thead>
      <tbody class="">
        <tr data-href="product/1.html">
          <td class="">1</td>
          <td class="">Apple</td>
          <td class="">150</td>
        </tr>
        <tr data-href="product/2.html">
          <td class="">2</td>
          <td class="">Orange</td>
          <td class="">350</td>
        </tr>
        <tr data-href="product/3.html">
          <td class="">3</td>
          <td class="">Peach</td>
          <td class="">400</td>
        </tr>
      </tbody>
    </table>
  </body>
</html>

まとめ

Cozy Webでのエンティティの作成、削除の方法について説明してきました。モデルの定義のみでシナリオに沿ったエンティティの作成、削除ができることが分かりました。またエンティティの作成、削除画面のカスタマイズも可能です。

次回はエンティティの削除について説明します。

諸元

Cozy
0.0.13