2012-01-07 19 views
1

私は、ユーザーがたくさんのデータを入力するデータ入力フォームを持っています。ユーザーが既存のデータを見るためにページに来ると、ページは読み取り専用モードで表示されます(すべての値がテキストとして表示されます)。[編集]ボタンをクリックすると、すべての入力コントロールを含む通常のフォームが表示され、データの変更と保存。JSFで読み取り専用フォームを表示しています(値は無効な入力コントロールではなくテキストとして表示されます)。

私たちはPrimeFacesライブラリでJSF 2.0を使用しています。上記のテキストボックスとテキストエリアの動作は簡単ですが、チェックボックス、マルチセレクト、ラジオ、.....コントロールは動作しません。あなたの助けのための

おかげで、私がやった...(バッキングBeanコード醜いを作るため、ラインの多くに遭遇することがある)

答えて

4

あなたは、このための追加のバッキングBeanのコードが必要だと思う理由は、私はよく分かりません。バッキングBeanにはすでに必要な値がすべてあります。あなたの問題は、それらの価値の提示にもっとあります。それに応じてビューコードを書くだけで、希望のフォーマットで表示することができます。おそらくあなたはそれを難し​​い方法と考えていたでしょう。

選択ブールチェックボックスの代わりに、たとえば「はい」または「いいえ」の値を表示できます。

<h:selectBooleanCheckbox value="#{bean.checked}" rendered="#{bean.edit}" /> 
<h:outputText value="#{bean.checked ? 'Yes' : 'No'}" rendered="#{not bean.edit}" /> 

メニューまたはラジオを選択する代わりに、値を出力テキストに表示するだけで済みます。代わりに選択し、多くのリストボックス/チェックボックスの

<h:selectOneMenu value="#{bean.selectedItem}" rendered="#{bean.edit}"> 
    <f:selectItems value="#{data.availableItems}" /> 
</h:selectOneMenu> 
<h:outputText value="#{bean.selectedItem}" rendered="#{not bean.edit}" /> 

、あなただけの、たとえばループでカンマ区切りのすべての値を表示することができます。

<h:selectManyListbox value="#{bean.selectedItems}" rendered="#{bean.edit}"> 
    <f:selectItems value="#{data.availableItems}" /> 
</h:selectManyListbox> 
<h:panelGroup rendered="#{not bean.edit}"> 
    <ui:repeat value="#{bean.selectedItems}" var="selectedItem" varStatus="loop"> 
     #{selectedItem}#{not loop.last ? ', ' : ''} 
    </ui:repeat> 
</h:panelGroup> 

ボイラープレートとコードの繰り返しを最小限に抑えるために、すべてをタグファイルまたはコンポジットにラップすることができます。

+0

コントロールのラベルが値と等しくない場合は、それほど単純ではありません。 – Sudhir

+0

たとえば、選択ブールチェックボックスの場合、ユーザに表示される値は「男性」と「女性」です。選択時に、ユーザーの選択に基づいてデータベースに「M」または「F」が格納されます。この場合、ビューモードで、 'Male'または 'Female'のいずれかを表示するには、追加のバッキングBeanコードを記述して、データベース値をユーザーが表示可能なテキストに変換する必要があります。同じように他のコントロールの問題もあります。上記のアプローチが機能するためには、コントロールのラベルはvalueと等しくなければならず、ほとんどの場合そうではありません。私が何かを見逃している場合は、私に知らせてください。 – Sudhir

+0

これらの値はすでに ''の後ろのデータにあります。それに応じてアクセスして印刷してください。将来的には、あなたがそのコメントのように、すぐに質問をしてください。 – BalusC

0

行動の上に達成することが可能な任意の簡単な方法はありますではなく、私たち自身のコードを書きますこれは私の最後のプロジェクトでは "プレビュー"属性を持つ複合コンポーネントを使用し、実装ではこの属性がtrueのときにテキストをレンダリングし、属性がfalseのときには実際の(編集)をレンダリングします。プレビューモードのチェックボックスでは、チェックボックス自体を表示することはできますが、無効にするとラジオで選択したアイテムが表示されます。

MyFaces Tomahawkライブラリ[1]には、この目的でdisplayValueOnly属性を追加する標準コンポーネントの拡張バージョンが含まれています。これはあなた(私はそれらを使用していない)を助けるかもしれません。

[1] - http://myfaces.apache.org/tomahawk-project/tomahawk20/index.html

関連する問題