af:Switcher

Sunday, September 7, 2008
Language: JAVA

Technology: Oracle ADF Framework

IDE : JDeveloper 10


فرض کنید سناریویی داریم که می خواهد در موقعیت های مختلف و یا با یک اکشن مورد نظر کامپوننت یا کامپوننت هایی را نشان داده یا مخفی کنیم af:switcher. دقیقاً برای این منظور طراحی شده است .

دراین مثال سعی دارم زمانی که

کاربر دکمه ی Table را کلیک کرد در صفحه کامپوننت
جدول را نمایش دهم و زمانی که
Tree را کلیک کرد کامپوننت درخت.


af:switcher چگونه کار می کند؟

همانطور که می دانید f:facet ها place holder هایی هستند که در بیشتر کامپوننت ها با اسامی ثابت و از پیش تعریف شده ای وجود دارند و این قابلیت را دارند که یک کامپوننت یا چندین کامپوننت را ؛ در محل خاصی در صفحه رندر کنند .

برای راه اندازی af:switcher باید خودتان دستی( به میزان مورد نیاز) f:facet ها را در این کامپوننت اضافه کنید و به آنها اسم بدهید . مثلاً من در مثال بالا به دو f:facet احتیاج دارم که کامپوننت های مورد نظر(درخت و جدول) را در آنها قرار دهم.(اسم های آنها را Tree و Table می گذارم)


af:switcher یک property با نام facetName دارد که نام facet که می خواهید در آن نمایش دهید را باید در آن set کنید . مثلاً اگر در این property رشته ی Table نوشته شود فقط facet ؛ Table نمایش داده می شود . در مثال بالا , باید ترتیبی دهیم که زمانی که کاربر دکمه ی Table را کلیک کرد این property با رشته ی Table پر شود و همینطور برای دکمه ی Tree به همین صورت.

پس اولین قدم Bind کردن af:switcher به یک manage bean می باشد.


سپس اضافه کردن دو af:setActionListener برای دو دکمه ی Tree و :Table

دکمه ی :Tree

دکمه یTable
به همین سادگی . و این هم نتیجه ی زمان اجرا


How to Select Current Row with af:commandLink Components inside a af:table

Tuesday, August 19, 2008
Language: JAVA

Technology: Oracle ADF Framework

IDE : JDeveloper 10

با سلام.
همانطوری که می دانید در یک جدول af:table برای انتخاب سطر جاری component آماده ای با نام af:tableSelectOne
استفاده می کنیم که باید در
facet ، selection قرار بگیرد.

گاهی در طراحیمان نیاز داریم که این کار توسط component دیگری مانند af:commandLink صورت یگیرد.


برای این کار باید مراحل زیر انجام شود:
1 - تبدیل component ستون دلخواه به af:commandLink:


برای این کار روی af:table تان در قسمت structure کلیک راست نموده و درcontext menu ظاهر شده گزینه ی properties را انتخاب کنید.

با انتخاب آن یک dialog با نام Table Properties ظاهر می گردد در Tab ، Column Summary ستون دلخواه را
انتخاب نموده و
Component آن را به af:commandLink تغییر دهید.



2– اضافه کردن Action ، setCurrentRowWithKey برای Iterator مربوطه در PageDefiniton صفحه:

همان طور که می دانید هر ViewObject در Data Control Pallet یک سری Operation های آماده دارد که به آنها Built in Operations اطلاق می شود.

یکی از این Operation ها setCurrentRowWithKey می باشد.


این Action مخصوص عوض کردن سطر جاری با استفاده از RowKey ورودی می باشد . (توجه! اینکه این پارامتر ورودی خود Key سطر را نمی گیرد بلکه آن را به فرمت "stringified" شده ی آن می گیرد. در این موضوع در پایان این متن توضیح خواهم داد).


برای اضافه کردن این Action در PageDefinition تان در Element ، Bindings این Action را برای iterator دلخواهتان اضافه کنید . این Action یک پارامتر ورودی با نام rowKey دارد . Value این پارامتر را به EL Expression #{row.rowKeyStr} قرار دهید . این EL Expresion دقیقاًً به کلید جاری سطری که انتخاب خواهید کرد Bind است.




<action IterBinding="CreateFormIterator"
id="setCurrentRowWithKey"
InstanceName="AppModuleDataControl.CreateForm"
DataControl="AppModuleDataControl"
RequiresUpdateModel="false"
Action="96">

<NamedData NDName="rowKey" NDValue="#{row.rowKeyStr}"
NDType="java.lang.String"/>


</action>




3 – مرحله ی آخر قرار دادن Action Listener برای af:commandLink صفحه ی JSF :

af:commandLink ستونتان را انتخاب کنید و در Property Inspector آن Action ساخته شده را execute کنید .

#{bindings.setCurrentRowWithKey.execute}

به همین سادگی : به نتیجه ی کار نگاه کنید:



تفاوت setCurrentRowWithKey و setCurrentRowWithKeyValue :
تفاوت این دو Action در این است که setCurrentRowWithKey پارامتر ورودی rowKey یک کلید به صورت stringified شده می گیرد

Action setCurrentRowWithKeyValue پارامتر ورودی rowKey را به صورت مقدار اصلی کلید
می گیرد مثلاً اگر در مثال بالا "
ID" ، فیلد keyAttribute ، View Object مان باشد باید به پارامتر این Action
مقدار
NDValue="#{row.ID}" را پاس دهیم.


<action IterBinding="CreateFormIterator"
id="setCurrentRowWithKeyValue"
InstanceName="AppModuleDataControl.CreateForm"
DataControl="AppModuleDataControl"
RequiresUpdateModel="false"
Action="98">

<NamedData NDName="rowKey" NDValue="#{row.ID}"
NDType="java.lang.String"/>

</action>


محدودیت های setCurrentRowWithKeyValue :

فرض کنید View Object که داریم یک ViewObject ، Read only یا Programmatically باشد در این صورت به طور پیش فرض هیچ یک از فیلد هایمان به عنوان Key Attribute معرفی نشده اند . پس شما مجبور می شوید خودتان یکی از آنها را انتخاب کنید . همچنین باید View Object تان Row Key ها را Manage کند که برای این منظور باید متود create() را در کلاس Implementation ، override کرده و این خط کد را به آن اضافه کنید (زمانی که اولین بار
Application Module اجرا می شود متود create() تمامی View Object ها در ابتدا صدا زده می شود):

protected void create() {

super.create();
setManageRowsByKey(true);

}

(View Object های entity Based به طور پیش فرض Row key ها را manage می کنند.)

حال یک سؤال دارم اگر چند فیلد به صورت Key Attribute معرفی شوند در پارامتر ورودی setCurrentRowWithKeyValue چه مقداری باید قرار گیرد ؟