الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

How To Show "yes-No-Cancel" Message Programaticaly In Oracle Adf

Featured Replies

بتاريخ:


Hi all
this segment of code display a popup message with only one button "OK" button

FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_WARN,
"Save Pending Changes !",
null));


I need to modify this code to display the popup with three Buttons"Yes - No- Cancel"
Is this possible
I search in the Java Doc for the Class FacesMessage but i did not find a way to show three buttons

بتاريخ:
  • كاتب الموضوع

I find another solution . I can useRichPopup class but acually I need example explaining how to add three buttons for the popup at runtime

تم تعديل بواسطة tarek_fathi

بتاريخ:
  • كاتب الموضوع


hi again
I find out that I can add RichDialog component and set the type to Yes-no-cancel buttons
but I want to know how to programaticly add RichDialog to RichPopup at runtime?
I check the RichPopup class for a method to add a child component but i ddinot find

بتاريخ:
  • كاتب الموضوع


I have another problem : the popup is not show

private void displayWarningMessage() {
//creates an instance of popup and set the id, which is equal to the tag <af:popup id="pop"/> in jsf page
RichPopup popup = new RichPopup();
popup.setId("msgpop");
//creates an instance of dialog and sets its properties, which is equal to the tag <af:dialog id="dlg" title="Title"/> in jsf page
RichDialog dialog = new RichDialog();
dialog.setId("dlg");
dialog.setTitle("Warning");
dialog.setType(dialog.TYPE_YES_NO_CANCEL);
//creates an instance of dialog and sets its properties, which is equal to the tag <af:outputText id="otindlg" value="Welcome"/>
oracle.adf.view.rich.component.rich.output.RichOutputText opText =
new oracle.adf.view.rich.component.rich.output.RichOutputText();
opText.setId("otindlg");
opText.setValue("Do you want to save changes before exit?");
dialog.getChildren().add(opText);
popup.getChildren().add(dialog);
RichPopup.PopupHints ph = new RichPopup.PopupHints();
ph.add(RichPopup.PopupHints.HintTypes.HINT_ALIGN,
RichPopup.PopupHints.AlignTypes.ALIGN_BEFORE_END);
popup.show(ph);

}
}




My question is there missing steps in this code to show the popup??

بتاريخ:

اخ / طارق اعتقد ان كل ما تحتاجه هو القليل من التركيز ليس اكثر

لو عاوز تظهر pop up فدى component فى ال ADF مالهاش اى علاقه بال FacesMessage واللى فهمته ان كل مشكلتك تتلخص انك عاوز تظهر pop up فيها yes-no-cancel ودى سهله اوى

اولا: حتضع داخل الصفحه بتاعتك pop up من ال component palette وتخلى ال Content Delivery هو lazy Uncached وده طبعا من ال property inspector

ثانيا: حتضع داخل ال pop up بتاعتك dialog وده component عادى جدا بتسحبه دراج ودروب من ال Component palette و تضعه داخل ال Pop up ومن ناحية عنوانه فده بتكتبه انت بنفسك فى البروبرتى انسبكتور بعد ما بتقف عليه وكمان بتختار ال type بتاعه من ال property inspector مثلا cancel-ok -okcanel-yesnocancel الخ .........................


وفى ال dialog listener ودى برضه موجوده فى ال Property Inspector ممكن تضع ميثود تنفذ حاجه معينه عند الضغط على yes او ok

ثالثا: حتضع الرساله بتاعتك داخل output Text جوه ال dialog ولاحظ ان كل الشغل لغاية دلوقتى هو component بنحطها فى الصفحه ومشتغلناش اى كود


دلوقتى بقه اخر حاجه اننا عاوزين نستدعى ال pop up دى عند الضغط على بوتون معين وده قدامك حلين وبما انك مصر على الحل البرمجى فعند الضغط على البوتون حتستدعى الميثود دى

  

public String showpopup () {
       FacesContext facesContext = FacesContext.getCurrentInstance();
       ExtendedRenderKitService service = Service.getRenderKitService(facesContext, ExtendedRenderKitService.class);
       service.addScript(facesContext,"AdfPage.PAGE.findComponent('popup1').show();");
       return null;
   }






وطبعا popup1 هو ال id الخاص بال pop up

وعلى فكره لاحظت فى الميثود الاخيره بتاعتك الكثير من الاخطاء يعنى مثلا انت عاوز ازاى تضع الميثود دى على بوتون وهى مبترجعش حاجه (void method) وبعدين ايه سبب وضعك لكل شىء برمجى الديالوج وال pop up اللى جواه حتى عنوانه ونوعه طيب ايه فايده استخدامك لل ADF ?????ضع كل شىء داخل الصفحه من ال component palette ثم استدعيه برمجيا لا اكثر من الباكينج بين الخاصه بالصفحه ولو راجعت المثال اللى فى الموضوع الخاص برساله الحذف حتلاقى التطبيق العملى للكلام ده

بتاريخ:
  • كاتب الموضوع

السلام عليكم
شكرا يا بشمهندسة هاله على الرد انا عملته فعلا و اشتغل معايا بس انا هشرح السيناريو اللى عندى و لية فكرت اعملها كدة

انا عندى صفحة jspx واحد بس و مسميها UIShell.jspx و هى مبنية على تيمبلت انا عاملها
الصفحة دى فيها dynamic task flow region

           <af:region id="main" value="#{bindings.region.regionModel}"
                      partialTriggers="::pt_cmi1 ::cmi1 ::proc ::cmi3 ::cmi4"/>



فى ال bindings بتاع الصفحة دى انا ضايف Executable task flow و اسمها region و هى binded على method بترجع TaskFlowId

   public TaskFlowId getDynamicTaskFlowId() {
       if (!this.pendingChangesExist()) {
           AdfFacesContext adfFacesContext =
               AdfFacesContext.getCurrentInstance();
           String currentTaskFlowId =
               (String)adfFacesContext.getPageFlowScope().get("CurrentTaskFlowId");
           if (currentTaskFlowId == null ||
               currentTaskFlowId.trim().equals("") == true) {
               currentTaskFlowId = taskFlowId;
           }
           oldTaskFlowId = currentTaskFlowId;
           return TaskFlowId.parse(currentTaskFlowId);
       } else {
           //displayWarningMessage
           String response = showpopup();
       }
       return TaskFlowId.parse(oldTaskFlowId);

   }


علشان كدة كانت الميثود القديمة اللى كنت عاملها كانت void
بس مشتغلتش كويس معايا علشان كدة لما شوفت الحل بتاعك قولت ما انا ممكن احط ال popup دى فى التمبلت و خلاص
و عملتها و اشتغلت

و لكم جزيل الشكر

بتاريخ:
  • كاتب الموضوع

الوقتى ظهر مشكلة تانية غريبة
بس قبل ما اقول المشكلة هقول انا اصلا عاوز اعمل اية
هو ببساطة انا عندى اكتر من task flow بيظهرو كلهم ك fragments فى صفحة واحدة من خلال مينيو
و اللى عاوزة ان لما اليوزر يضيف سجل او يعدل او يحزف سجل و بعدين يضغط على المنيو او على home
يعنى يخرج من الtaskflow اللى كان فيها و يروح على مكان تانى
تظهرله رساله "هل تريد حفظ التعديلات؟"

امل بالنسبة للمشكلة و هى ان الرسالة فى اول مرة بتظهر فعلا و لما اليوزر يظغط على YES بيحفظ
لكن لما يعدل فى بيانات فى صفحة تانية و يخرج من الصفحة و يروح على مكان تانى مبتظهرش الرسالة
مش كدة و بس دة و بيحفظ لوحدة كدة مع نفسة التغيرات فى الداتابيز
عملت debug للكود و مشيت معاه واحدة واحدة

public class dynamicTaskFlowManager {
   private String taskFlowId = "/WEB-INF/flows/welcome.xml#welcome";
   private String oldTaskFlowId;  
   private String saveChangeDialogRespose;
   
   public TaskFlowId getDynamicTaskFlowId() {
      
           AdfFacesContext adfFacesContext =  AdfFacesContext.getCurrentInstance();
           String currentTaskFlowId =        (String)adfFacesContext.getPageFlowScope().get("CurrentTaskFlowId");
         if (!this.pendingChangesExist()) {
           if (currentTaskFlowId == null ||
               currentTaskFlowId.trim().equals("") == true) {
               currentTaskFlowId = taskFlowId;            }
               oldTaskFlowId = currentTaskFlowId;            
        
       } else {
   // show save changes alert
           showSaveChangesDialog();
           if (getSaveChangeDialogRespose() == "YES") {
               commitChanges();                
               hideSaveChangesDialog();                         
           }
       }
     return TaskFlowId.parse(currentTaskFlowId);     

   }

   private boolean pendingChangesExist() {
       return this.getApplicationModule("#{data.DhamanADMServicesDataControl.dataProvider}").getTransaction().isDirty();
   }

   private ApplicationModule getApplicationModule(String dataProvider) {
       FacesContext fc = FacesContext.getCurrentInstance();
       Application app = fc.getApplication();
       ExpressionFactory elFactory = app.getExpressionFactory();
       ELContext elContext = fc.getELContext();
       ValueExpression valueExp =
           elFactory.createValueExpression(elContext, dataProvider,
                                           Object.class);

       return (ApplicationModule)valueExp.getValue(elContext);
   }

   public dynamicTaskFlowManager() {
       super();
   }

   public void showSaveChangesDialog() {
       FacesContext facesContext = FacesContext.getCurrentInstance();
       ExtendedRenderKitService service =
           Service.getRenderKitService(facesContext,
                                       ExtendedRenderKitService.class);
       service.addScript(facesContext,
                         "AdfPage.PAGE.findComponent('pt1:msgPopup').show();");

   }
 public void hideSaveChangesDialog() {
     FacesContext facesContext = FacesContext.getCurrentInstance();
     ExtendedRenderKitService service =
         Service.getRenderKitService(facesContext,
                                     ExtendedRenderKitService.class);
     service.addScript(facesContext,
                       "AdfPage.PAGE.findComponent('pt1:msgPopup').hide();");

 }
   public void handleSaveChangesDialog(DialogEvent event) {
       if (event.getOutcome().equals(DialogEvent.Outcome.yes)) {
           setSaveChangeDialogRespose("YES");
       } else if (event.getOutcome().equals(DialogEvent.Outcome.no)) {
           setSaveChangeDialogRespose("NO");
       } else {
           setSaveChangeDialogRespose("CANCEL");
       }
   }

   public void setSaveChangeDialogRespose(String saveChangeDialogRespose) {
       this.saveChangeDialogRespose = saveChangeDialogRespose;
   }

   public String getSaveChangeDialogRespose() {
       return saveChangeDialogRespose;
   }
   public String commitChanges(){
     BindingContext bctx = BindingContext.getCurrent();
     DCDataControl dcDataControl = bctx.getDefaultDataControl();
     dcDataControl.commitTransaction();
     return null;
   }
}



الميثود اللى اسمها TaskFlowId هى دى اللى بنبدا بيها
و فى الميثود دى باختصار انا بشوف اول هل فى تعديلات حصلت
لو فيه بتظهر الرسالة
و ال dialog بيرجع ال event
لو الevent ب yes
بندة للميثود commitChanges اللى بتحفظ فى الداتابيز

لما جيت اعمل debug و لما وصلت بلظبط للجذء دة

           showSaveChangesDialog();
           if (getSaveChangeDialogRespose() == "YES") {
               commitChanges();                
               hideSaveChangesDialog();                         
           }
       }


لقيت اولا الpopup مش بتظهر
و بعدين بيدخل فى ال IF condition و يكمل فيها و يعمل حفظ و يخفى ال popup
كل دة من غير ما تظهر popup و لا اختار yes
كانه محتفظ بال response فى الكاش
مش عارف اية المشكلة دى ممكن تكون بسبب اية
ارجوو المساعدة

بتاريخ:
  • كاتب الموضوع

سبحان الله بعد ما كتبت ال post قولت لما اقراها كدة و لما قريتها اكتشفت الخطأ فين
المفروض انى ارجع ال saveChangeDialogRespose ب null بعد ما تعمل commit علشان ميحتفظشى بالرد القديم
و غيرت الكود ل

            showSaveChangesDialog();
           if (getSaveChangeDialogRespose() == "YES") {
               commitChanges();
               setSaveChangeDialogRespose(null);
               hideSaveChangesDialog(); 
               
           }


و اشتغلت
انا عارف انى عامل ازعاج على المنتدى معلش

بتاريخ:

انا عجبنى جدا انك بتكتب المشكلة ولما تحلها بتكتبه برده
جزاك الله كل خير
تمنياتى لك بالتوفيق فى حياتك

بتاريخ:

ما دام المشكله اتحلت خلاص ولكن الموضوع فكرنى ب post كانت فى ال OTN عن موضوع اجبار ال user على حفظ التغييرات او التراجع عنها قبل مغادرته للصفحه او الفراجمنتس او حتى الضغط على back وكان الحل بسيط بعمل كلاس واحده للابليكيشن كله والخلاصه ان دور الكلاس دى انها بتعمل check على commit فى كل مره اليوزر بيعمل navigation لو هو enabled بتظهر له رساله بالحفظ او التراجع قبل عمل اى navigation والموضوع كان global mechanism

  • بعد 2 سنة...
بتاريخ:

أخت 

Hala Salem

 

في ردك الخاص بشرح كيفية عمل واستدعاء Pop up  فيها Yes and No

 

قلتي

دلوقتى بقه اخر حاجه اننا عاوزين نستدعى ال pop up دى عند الضغط على بوتون معين وده قدامك حلين وبما انك مصر على الحل البرمجى فعند الضغط على البوتون

حتستدعى الميثود دى

 

فأرجو التوضيح أن امكن اذا كان هناك طريقة غير الحل البرمجي وممكن أستخدامها
وشكرا

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.