タイトル【MacWIRE配信予定】倉橋浩一、じつはWebObjectsで飯食ってます》掲示板にコメント機能を追加してを仕上げる(2)カテゴリーWebObjects, 倉橋浩一、じつはWebObjectsで飯食っています
作成日2001/12/1 14:46:36作成者新居雅行
コンポーネントの用意が出来たので、作り込みに入ります。

(1) MessageListPage.woで、WORepetitionの内側にあるTABLE(タイトル、メッセージなどを表示するためのもの)を選択し、cutします。
(2) OneMessageBox.woにpasteします。
(3) pasteしたTABLEの下にWORepetitionを配置し、その内側に1行2列、幅100%のTABLEを配置します。
(4) TABLEの左側のセルの"Cell"の文字を消し、幅を20pixelsに設定します。
(5) 左側のセルの"Cell"の文字を選択し、WebObjectsメニューから"Custom WebObject"を選択します。"Custom WebObject"ダイアログが開きますので、"WebObject class to use:"に"OneMessageBox"と入力します。
(6) "Edit Source..."から"Add Key..."を選び、MessageクラスのaMessageと、MessageクラスのaCommentと、WODisplayGroupクラスのdgMessageを追加します。
(7) "Show API Editor"アイコンをクリックし、"API Editor"ダイアログを開きます。
(8) "Add Keys From Class"をクリックします。aMessage, aComment, dgMessageが表示されますが、aCommentを選択してから右上の「プラスマイナス」アイコンから"Delete binding"を選び、削除します。そして、Requied欄をチェックします。通常のエレメントにはいくつかのアトリビュートがあり、オブジェクトなどをバインドしたり値を設定したりすることができるようになっていますね。これと同様にして、埋め込みコンポーネントに対して、アトリビュートを作ってやるための作業です。ここでは、一つのメッセージを表示するのでそれをaMessageを通して受け渡しします。また、このメッセージに対してコメントを書きますので、WODisplayGroupのdgMessageを渡してもらいます。

 

(9) WORepetitionのlistとaMessage.comments, itemとaCommentをバインドします。
(10) OneMessageBox上のOneMessageBoxにオブジェクトをバインドします。OneMessageBoxのaMessageとaComment, dgMessageとdgMessageをそれぞれバインドしてください。

 

(11) "Edit Source"の"Add Action..."を用いて、MessagePageを返すactionCommentを追加します。
(12) メッセージ表示部分の適当な場所に、WOHyperlinkを配置し、タイトルに"このメッセージにコメント"と設定します。
(13) このWOHyperlinkのactionと、actionCommentをバインドします。コンポーネントを保存します。

この時点で、OneMessageBoxは以下のような状態になっているはずです。

 

(14) MessageListPage.woを開きます。
(15) 先ほど(1番)で一つのメッセージを表示するために使用していたTABLEを削除しましたが、ここにOneMessageBoxを配置します。WebObjectsメニューから"Custom WebObject"を選び、OneMessageBoxを指定します。
(16) OneMessageBoxのaMessageとaMessage、dgMessageとdgMessageをバインドします。コンポーネントを保存します。

 

さて、これでWOBuilder上の作業は終わりです。整理すると、メッセージ表示部分をOneMessageBoxに写し、OneMessageBoxでコメントを表示するための機能を付加し、コメントを書き込むためのリンクを用意し、メッセージ一覧表示にメッセージ表示boxを埋め込む、という作業でした。

"Edit Source"から"View Source File"を選び、ProjectBuilderに戻ります。

(1)MessageListPage.javaのactionDeleteをcutし、OneMessageBox.javaにpasteします。これは、メッセージを削除するための処理が、従来はメッセージ一覧ページ上にありましたが、これがOneMessageBox上に移ったことに伴う処置です。
(2)MessageListPage.javaのsetBoard関数の

board = newBoard;

の次の後に、

ddgMessage.setQualifier(EOQualifier.qualifierWithQualifierFormat("rootMessage = nil", null)));

を追加します。これは、メッセージ一覧を表示する際に、rootとなるメッセージのみを表示するための処理です。rootとなるメッセージは自分自身の親を持たないのでrootMessageがnullになりますので、display groupに対してrootを持たないメッセージだけ表示するように指示しているわけです。
(3) OneMessageBox.javaのactionCommentに必要な処理を書きます。詳細はソースをご覧いただくことにして、やっていることは以下の通りです。やや長い処理になっていますが、大部分は"re :"や" > "を付け加えるための処理で、リレーションのための特別な処理は一行だけ(addObjectToBothSidesOfRelationshipWithKey関数一つ)で済んでます。
 1.元のメッセージのタイトルとメッセージを取り出して"Re: "や" > "を追加して、コメントに設定する。
 2.元のメッセージのリレーションとして、コメントを追加する(addObjet....)。
 3.用意したコメントをメッセージを書き込むためのページ(MessagePage)に渡す。

では、ビルドして実行してみます。"このメッセージにコメント"をクリックしてメッセージを書き込むと、ちゃんと少し右にずれた形でコメントが表示されるのがおわかりいただけますでしょうか。

 

これで、当初目標にしていた掲示板の機能をすべて実装できました。登録も検索もスレッド表示もできて、一応掲示板としての基本機能が揃いました。でも、以前も書きましたが、例によってデザイン最悪ですね(泣)。

◇掲示板アプリケーションのプロジェクト一式
 http://mdonline.jp/figs/01/0045/SimpleBoard.tgz

MacWIRE上の「WebObjectsで飯食ってます」はこれで一区切りとなります。連載開始からほぼ1年たつわりに、サンプル2本だけで、あとは雑談だけで終わってしまって申し訳ありません。新居さんに付けていただいた「WebObjectsで飯食ってます」っていうタイトルは妙に気に行っておりますので、またどこかでお目にかかれるといいのですが。

なお、MDOnlineでは、「WebObjectsで飯食ってます」の他に、"WebObjects Practice"という記事を連載しています。MDOnlineの読者の方々しか購読はできません。こちらは、WebObjects 5を中心にすでにWebObjectsでお仕事をされている方に向けた実践的なネタを扱っています。ちなみに次回の記事では今回の電子掲示板にエラーチェックなどを組み込み、よる実用的なものに仕上げてご紹介します。そちらも今後ともよろしくお願い致します。
(この項、以上)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ