タイトル倉橋浩一、じつはWebObjectsで飯食ってます》掲示板を機能アップして複数の掲示板に対応(1)データベース関連の設定カテゴリーWebObjects, 倉橋浩一、じつはWebObjectsで飯食っています
作成日2001/10/30 17:19:29作成者新居雅行
□まず最初に....
前回の記事で、同時多発テロ被災者救援のための義援金への御協力をお願いしましたところ、たくさんの方にご賛同いただきました。この場をお借りして、お礼申し上げます。

□ご無沙汰しています
掲示板の続きです。最初に掲載されたのが1月ですから、かれこれ8ヶ月....こんな仕事態度ではいけないわ、と思いつつも、夏休みの宿題を片づけ終わるのも9月下旬だったなぁと遠い目をする倉橋でございます。申し訳ありませぬ。

さて、掲示板の機能は以下の通りです。

1.「書き込みをやめる」ボタン
2.メッセージ一覧ページにページめくりの機能を追加
3.メッセージ削除の機能
4.複数掲示板のサポート
5.コメント機能

前回1〜3まで片づけましたから、今回は4を作ります。今回で終わらせる予定でしたが、予想以上に長くなってしまいまして....検索機能も追加しましたので、どうかご勘弁を。

□追加する機能について
まず、今回は複数掲示板関連の機能、次回にコメント機能を作ります。これらの機能はどちらもリレーションを使って実現しています。複数掲示板は一つの掲示板情報が、複数のメッセージを持っているという構成、コメント機能は一つのメッセージが一つの親メッセージと複数の子メッセージを持っているという構成を、それぞれイメージしてください。

複数掲示板の構成は、リレーションとしてはごく一般的なものです。一方のコメント機能は、うまく実装できないツールも少なくありません。幸いなことに、WebObjectsは、リレーションに関しても非常に柔軟性の高い取り扱いが可能ですので、どちらも分かりやすく実装することができます。

では、作業を始めましょう。例によってSimleBoardをProjectBuilderで開いておいてください。

□リレーションを追加する
手始めに、SimpleBoard.eomodeldに必要なリレーションを追加します。ProjectBuilderのResourcesグループからSimpleBoard.eomodeldをダブルクリックしてEOModelerを立ち上げます。

リレーションを追加するには、Entityを選択してから"New Relationship in Selected Entity"アイコンをクリックします(Properyメニューから"Add Relationshiop"でも可)。まずはEntityとしてBoardを選び、Add Relationshipします。
"Inspect Selection"アイコンをクリックし(Toolsメニューから"Inspector")、Inspectorパネルを開きます。図のようにパネルを設定し、Connectボタンをクリックします。

 

これで「BoardのdataIDと、MessageのboardIDとが接続された、arrayMessageという名前のTo Manyリレーション」が定義されました。

同様にして、EntityのMessageを選んでAdd Relationshipを行い、「MessageのboardIDとBoardのdataIDが接続された、boardという名前のTo Oneリレーション」と、「MessageのmessageIDとMessageのdataIDが接続されたrootMessageという名前のTo Oneリレーション」と、「MessageのdataIDとMessageのmessageIDが接続されたcommentsという名前のTo Manyリレーション」を追加します。

 
 
 

最後の2つは、テーブル自身へのリレーションです。こういう設定を簡単に取り扱うことのできないデータベースも少なくないのですが、WebObjects/EOFでは他のリレーション同様、簡単に実装することができます。

□掲示板メンテナンス機能
現在のところ、トップページでリンク「掲示板へ」をクリックするとすぐに掲示板にアクセスできてしまいます。これを拡張して、トップページに掲示板名の一覧を表示し、掲示板名をどれかクリックすると、その掲示板にアクセスできる、という仕様にします。そのためには、

1.掲示板名を表示する機能
2.掲示板を登録・削除するための機能

が必要になります。今回は、誰でも掲示板を登録することができるようにします。また、削除はパスワードを知っている人だけが可能、ということにします。
なお、予定にはありませんでしたが、ついでですから、メッセージ検索のための機能も追加してしまいましょう。掲示板が複数あると、どこに何が書いてあるか探すのも大変ですし。

さて、掲示板だからといって特にややこしいことはありません。普通にレコードを登録・削除するのと同じことです。ただ、前記のように、削除にはいくつか制限を設けてありますので、そのための条件判断が加わります。

□掲示板名の表示
ProjectBuilderのWebComponentsからMain.woをダブルクリックしてWOBuilderを起動します。
EOModelerのBoardアイコンをWOBuilderにドラッグ&ドロップして、開いたパネルでdgBoardと入力して"Add & Configure"をクリックし、"Display Option Group"パネル上でFetch on load:チェック, Entities per batch:0, sorting:boardName/Ascendingに設定し、"OK"をクリックします。

 

WOBuilder上のMain.woで「掲示板へ」のWOHyperlinkを選択してから、2行2列のTABLEを配置します。図のパネル左下にチェックをすると、最初の行をヘッダーセルにし、2行めに自動的にWORepetitionをかぶせてくれます。

 

Tableには下図のようにタイトルを付けます。

 

行を表示するための変数を追加します。Edit Sourceから"Add key..."を選択し、下図のように設定し、OKをクリックします。BoardクラスのaBoardが追加されます。

 

この状態で、dgBoardのdisplayedObjectsとWORepetitionのlistをバインドし、aBoardとitemとをバインドします。
Edit Sourceから"Add Action..."を選び、"削除"がクリックされた時に呼び出されるアクション関数actionDeleteを追加します。actionDeleteの戻り値はnullにしておきます。
掲示板名を表示するためのWOStringをテーブル2行目の左側のセルに配置し、aBoardのboardNameとWOStringのvalueとをバインドします。さらに、このWOStringを選択してからWOHyperlinkをクリックします。そして、このWOHyperlinkとactionMessageListとバインドします。actionMessageListは前回作ったアクション関数です。
右側のセルには"削除"と入力し、この2文字を選択した状態でWOHyperlinkをクリックしてリンクを作ります。このWOHyperlinkはactionDeleteとバインドしておきます。

ここまでで、下図のようなコンポーネントができ上がりました。掲示板名をクリックするとその掲示板に入ることができ、"削除"をクリックすると削除のための処理に入ります(もちろん、まだそのための処理を書いていませんが)。

 

(続く)
[倉橋浩一/テクニカル・ピット]
関連リンクWebObjectsのページ